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.
### 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

View file

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

View file

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