eval: add write, eval arguments before applying function
This commit is contained in:
32
eval/eval.go
32
eval/eval.go
@@ -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] = "ed
|
||||
} 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) {
|
||||
|
Reference in New Issue
Block a user