added progn form
This commit is contained in:
parent
8278430882
commit
44beab651c
3 changed files with 21 additions and 2 deletions
|
|
@ -43,10 +43,11 @@ Use the `func` function from the stdlib:
|
||||||
In this case, `(form_to_be_evaluated)` will not be evaluated until the function is called.
|
In this case, `(form_to_be_evaluated)` will not be evaluated until the function is called.
|
||||||
|
|
||||||
### Control flow
|
### Control flow
|
||||||
See `stdlib/control_flow.go`. We have if and while forms:
|
See `stdlib/control_flow.go`. We have if, while, and progn forms:
|
||||||
`(if (cond) (then) (else))`
|
`(if (cond) (then) (else))`
|
||||||
`(when (cond) (form1)....... (formN))`
|
`(when (cond) (form1)....... (formN))`
|
||||||
|
`(progn (form1)..... (formN))`
|
||||||
|
If and While should be self explanatory. For those new to LISP, the rough idea of progn is to evaluate a sequence of N forms and return the result of the final one.
|
||||||
We also have functioning implementations of map and reduce in the stdlib (incomplete)
|
We also have functioning implementations of map and reduce in the stdlib (incomplete)
|
||||||
|
|
||||||
## Comments
|
## Comments
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,17 @@ import (
|
||||||
"gitlab.com/whom/shs/log"
|
"gitlab.com/whom/shs/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/* eval N forms. return the last one
|
||||||
|
*/
|
||||||
|
func shs_progn(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
|
||||||
|
var res *ast.Token
|
||||||
|
for iter := in; iter != nil; iter = iter.Next {
|
||||||
|
res = iter.Eval(ft, vt, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
/* return one evaluated form or another based on the boolean statement
|
/* return one evaluated form or another based on the boolean statement
|
||||||
*/
|
*/
|
||||||
func shs_if(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
|
func shs_if(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,13 @@ func GenFuncTable() ast.FuncTable {
|
||||||
Args: -1,
|
Args: -1,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"progn": &ast.Function{
|
||||||
|
Function: shs_progn,
|
||||||
|
Name: "shs_progn",
|
||||||
|
TimesCalled: 0,
|
||||||
|
Args: -1,
|
||||||
|
},
|
||||||
|
|
||||||
"eval": &ast.Function{
|
"eval": &ast.Function{
|
||||||
Function: eval,
|
Function: eval,
|
||||||
Name: "eval",
|
Name: "eval",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue