eval: add write, eval arguments before applying function

This commit is contained in:
2018-05-15 22:13:43 +02:00
parent 45822a2ecd
commit 6413bd7e81
4 changed files with 53 additions and 16 deletions

View File

@@ -24,6 +24,7 @@ func RootEnv() ast.Env {
"cdr": evalCdr,
"null?": evalNull,
"pr": evalPr,
"write": evalWrite,
"table": evalTable,
"type": evalType,
"len": evalLen,
@@ -318,11 +319,23 @@ func funcApply(f ast.Func, args []*ast.AST, e ast.Env) (*ast.AST, error) {
}
for i, a := range f.Params {
f.Env.Values[a] = args[i]
evald, err := Eval(args[i], e)
if err != nil {
return nil, err
}
f.Env.Values[a] = evald
}
if f.HasRest() {
lst := ast.AST{ast.List, args[plen:]}
var l []*ast.AST
for _, arg := range args[plen:] {
evald, err := Eval(arg, e)
if err != nil {
return nil, err
}
l = append(l, evald)
}
lst := ast.AST{ast.List, l}
quoted := ast.AST{ast.Quoted, &lst}
f.Env.Values[*f.Rest] = &quoted
} else {
@@ -330,7 +343,11 @@ func funcApply(f ast.Func, args []*ast.AST, e ast.Env) (*ast.AST, error) {
i := plen
for kv, ok := iter(); ok; kv, ok = iter() {
if i < alen {
f.Env.Values[kv.Key.(string)] = args[i]
evald, err := Eval(args[i], e)
if err != nil {
return nil, err
}
f.Env.Values[kv.Key.(string)] = evald
} else {
f.Env.Values[kv.Key.(string)] = kv.Value.(*ast.AST)
}
@@ -350,6 +367,15 @@ func evalPr(l []*ast.AST) (*ast.AST, error) {
return &nilVal, nil
}
func evalWrite(l []*ast.AST) (*ast.AST, error) {
var toPrint []string
for _, elem := range l {
toPrint = append(toPrint, elem.String())
}
fmt.Print(strings.Join(toPrint, " "))
return &nilVal, nil
}
func evalIf(l []*ast.AST, e ast.Env) (*ast.AST, error) {
i := 0
for i < len(l) {