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.
|
||||
|
||||
### 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))`
|
||||
`(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)
|
||||
|
||||
## Comments
|
||||
|
|
|
|||
|
|
@ -22,6 +22,17 @@ import (
|
|||
"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
|
||||
*/
|
||||
func shs_if(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
|
||||
|
|
|
|||
|
|
@ -42,6 +42,13 @@ func GenFuncTable() ast.FuncTable {
|
|||
Args: -1,
|
||||
},
|
||||
|
||||
"progn": &ast.Function{
|
||||
Function: shs_progn,
|
||||
Name: "shs_progn",
|
||||
TimesCalled: 0,
|
||||
Args: -1,
|
||||
},
|
||||
|
||||
"eval": &ast.Function{
|
||||
Function: eval,
|
||||
Name: "eval",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue