rework eval loop to unwrap lists when function calls return
This commit is contained in:
parent
1889942db8
commit
3b0fb09e30
3 changed files with 45 additions and 11 deletions
43
ast/eval.go
43
ast/eval.go
|
|
@ -19,15 +19,17 @@ package ast
|
||||||
|
|
||||||
import "git.callpipe.com/aidan/shs/log"
|
import "git.callpipe.com/aidan/shs/log"
|
||||||
|
|
||||||
func (t *Token) Eval(funcs FuncTable, vars VarTable) *Token {
|
func (t *Token) Eval(funcs FuncTable, vars VarTable) (*Token, bool) {
|
||||||
if t == nil {
|
if t == nil {
|
||||||
return nil
|
return nil, false
|
||||||
}
|
}
|
||||||
|
|
||||||
eligibleForSystemCall := true
|
eligibleForSystemCall := true
|
||||||
|
|
||||||
var reduce func(*Token) *Token
|
var reduce func(*Token) *Token
|
||||||
reduce = func(t_ *Token) *Token {
|
reduce = func(t_ *Token) *Token {
|
||||||
|
var unwrap bool
|
||||||
|
|
||||||
if t_.Next != nil {
|
if t_.Next != nil {
|
||||||
t_.Next = reduce(t_.Next)
|
t_.Next = reduce(t_.Next)
|
||||||
}
|
}
|
||||||
|
|
@ -36,7 +38,12 @@ func (t *Token) Eval(funcs FuncTable, vars VarTable) *Token {
|
||||||
case SYMBOL:
|
case SYMBOL:
|
||||||
maybeToken := GetVar(t_.Inner.(string), vars)
|
maybeToken := GetVar(t_.Inner.(string), vars)
|
||||||
if maybeToken != nil {
|
if maybeToken != nil {
|
||||||
tok := maybeToken.Eval(funcs, vars)
|
tok, _ := maybeToken.Eval(funcs, vars)
|
||||||
|
// Should already be unwrapped
|
||||||
|
//if unwrap {
|
||||||
|
// tok = tok.Inner.(*Token)
|
||||||
|
//}
|
||||||
|
|
||||||
if tok.Tag == LIST {
|
if tok.Tag == LIST {
|
||||||
eligibleForSystemCall = false
|
eligibleForSystemCall = false
|
||||||
}
|
}
|
||||||
|
|
@ -47,13 +54,33 @@ func (t *Token) Eval(funcs FuncTable, vars VarTable) *Token {
|
||||||
|
|
||||||
case LIST:
|
case LIST:
|
||||||
eligibleForSystemCall = false
|
eligibleForSystemCall = false
|
||||||
t_.Inner = t_.Inner.(*Token).Eval(funcs, vars)
|
t_.Inner, unwrap = t_.Inner.(*Token).Eval(funcs, vars)
|
||||||
|
if unwrap {
|
||||||
|
next := t_.Next
|
||||||
|
t_ = t_.Inner.(*Token)
|
||||||
|
if t_ == nil {
|
||||||
|
log.Log(log.DEBUG, "nil Inner on list unwrap", "eval")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
i := &t_
|
||||||
|
for (*i).Next != nil {
|
||||||
|
i = &((*i).Next)
|
||||||
|
}
|
||||||
|
|
||||||
|
(*i).Next = next
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return t_
|
return t_
|
||||||
}
|
}
|
||||||
|
|
||||||
ret := reduce(t)
|
ret := reduce(t)
|
||||||
|
if ret == nil {
|
||||||
|
log.Log(log.INFO, "reduce returned nil", "eval")
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
if ret.Tag == SYMBOL {
|
if ret.Tag == SYMBOL {
|
||||||
f := GetFunction(ret.Inner.(string), funcs)
|
f := GetFunction(ret.Inner.(string), funcs)
|
||||||
if f == nil {
|
if f == nil {
|
||||||
|
|
@ -61,15 +88,15 @@ func (t *Token) Eval(funcs FuncTable, vars VarTable) *Token {
|
||||||
log.Log(log.DEBUG,
|
log.Log(log.DEBUG,
|
||||||
"could not find definition for symbol " + ret.Inner.(string),
|
"could not find definition for symbol " + ret.Inner.(string),
|
||||||
"eval")
|
"eval")
|
||||||
return nil
|
return nil, false
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: hook into stdlib exec
|
// TODO: hook into stdlib exec
|
||||||
return nil // TODO: Thats gotta change
|
return nil, false // TODO: Thats gotta change
|
||||||
}
|
}
|
||||||
|
|
||||||
return (*f).CallFunction(ret.Next, vars, funcs)
|
return (*f).CallFunction(ret.Next, vars, funcs), true
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret
|
return ret, false
|
||||||
}
|
}
|
||||||
|
|
|
||||||
10
cmd/repl.go
10
cmd/repl.go
|
|
@ -106,7 +106,13 @@ func main() {
|
||||||
ast.PrintSExprsIndividually(userInput)
|
ast.PrintSExprsIndividually(userInput)
|
||||||
}
|
}
|
||||||
|
|
||||||
result := userInput.Eval(funcs, vars)
|
result, unwrap := userInput.Eval(funcs, vars)
|
||||||
fmt.Println(result.String() + "\n")
|
if unwrap {
|
||||||
|
result = result.Inner.(*ast.Token)
|
||||||
|
}
|
||||||
|
for i := result; i != nil; i = i.Next {
|
||||||
|
fmt.Printf(i.String() + " ")
|
||||||
|
}
|
||||||
|
fmt.Printf("\n")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,7 @@ func l_append(input *ast.Token, vars ast.VarTable, funcs ast.FuncTable) *ast.Tok
|
||||||
iter = &((*iter).Next)
|
iter = &((*iter).Next)
|
||||||
}
|
}
|
||||||
(*iter).Next = input.Next
|
(*iter).Next = input.Next
|
||||||
|
input.Next = nil
|
||||||
|
|
||||||
return src.Inner.(*ast.Token)
|
return src
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue