added progn form

This commit is contained in:
Aidan 2020-07-18 10:44:18 -07:00
parent 8278430882
commit 44beab651c
No known key found for this signature in database
GPG key ID: 327711E983899316
3 changed files with 21 additions and 2 deletions

View file

@ -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

View file

@ -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 {

View file

@ -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",