retrofit call functions for new eval alg

This commit is contained in:
Aidan 2020-06-29 19:15:00 -07:00
parent ea99142b3a
commit 2ae1145a50
No known key found for this signature in database
GPG key ID: 327711E983899316
9 changed files with 384 additions and 25 deletions

View file

@ -17,9 +17,7 @@
package ast
import (
"gitlab.com/whom/shs/log"
)
import "gitlab.com/whom/shs/log"
/* determines whether or not to execute a system call
* when a function cannot be found in the functable
@ -36,7 +34,7 @@ var ExecFunc = "l"
* canFunc determines whether a symbol could be a function to call
* (true when first elem of a list)
*/
func (in *Token) Eval(funcs FuncTable, vars VarTable) *Token {
func (in *Token) Eval(funcs FuncTable, vars VarTable, cnvtUndefVars bool) *Token {
if in == nil {
return nil
}
@ -53,6 +51,12 @@ func (in *Token) Eval(funcs FuncTable, vars VarTable) *Token {
res = in
if GetFunction(in.Value(), funcs) == nil {
if cnvtUndefVars {
in.Tag = STRING
res = in
break
}
log.Log(log.ERR,
"undefined symbol: "+in.Value(),
"eval")
@ -70,7 +74,7 @@ func (in *Token) Eval(funcs FuncTable, vars VarTable) *Token {
}
if inner.Tag != SYMBOL {
in.Direct(inner.Eval(funcs, vars))
in.Direct(inner.Eval(funcs, vars, cnvtUndefVars))
res = in
break
}
@ -86,9 +90,9 @@ func (in *Token) Eval(funcs FuncTable, vars VarTable) *Token {
if funct != nil {
if makeHead {
inner = &Token{inner: inner}
inner = &Token{Next: inner}
}
res = funct.CallFunction(inner.Next, vars, funcs).Eval(funcs, vars)
res = funct.CallFunction(inner.Next, vars, funcs).Eval(funcs, vars, false)
if res == nil {
// function failed. logging is its responsibility
return nil
@ -111,7 +115,7 @@ func (in *Token) Eval(funcs FuncTable, vars VarTable) *Token {
}
if res.Next != nil {
res.Next = res.Next.Eval(funcs, vars)
res.Next = res.Next.Eval(funcs, vars, cnvtUndefVars)
}
return res
}