retrofit call functions for new eval alg
This commit is contained in:
parent
ea99142b3a
commit
2ae1145a50
9 changed files with 384 additions and 25 deletions
20
ast/eval.go
20
ast/eval.go
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue