|
|
@@ -33,7 +33,7 @@ type value struct {
|
|
|
var env []environ
|
|
|
var stack []value
|
|
|
|
|
|
-func interpret(scanner *bufio.Scanner) value {
|
|
|
+func interpret(scanner *bufio.Scanner) (val value, returned bool) {
|
|
|
stackTop, returned := len(stack), false
|
|
|
scanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) {
|
|
|
start := 0
|
|
|
@@ -150,7 +150,7 @@ func interpret(scanner *bufio.Scanner) value {
|
|
|
case "isname":
|
|
|
stack[i] = opIsName(stack[i+1])
|
|
|
case "run":
|
|
|
- stack[i] = opRun(stack[i+1])
|
|
|
+ stack[i], returned = opRun(stack[i+1])
|
|
|
case "eq":
|
|
|
stack[i] = opEq(stack[i+1], stack[i+2])
|
|
|
case "gt":
|
|
|
@@ -164,7 +164,7 @@ func interpret(scanner *bufio.Scanner) value {
|
|
|
case "not":
|
|
|
stack[i] = opNot(stack[i+1])
|
|
|
case "if":
|
|
|
- stack[i] = opIf(stack[i+1], stack[i+2], stack[i+3])
|
|
|
+ stack[i], returned = opIf(stack[i+1], stack[i+2], stack[i+3])
|
|
|
case "isnumber":
|
|
|
stack[i] = opIsNumber(stack[i+1])
|
|
|
case "isword":
|
|
|
@@ -176,8 +176,7 @@ func interpret(scanner *bufio.Scanner) value {
|
|
|
case "isempty":
|
|
|
stack[i] = opIsEmpty(stack[i+1])
|
|
|
case "return":
|
|
|
- stack[i] = opReturn(stack[i+1])
|
|
|
- returned = true
|
|
|
+ stack[i], returned = opReturn(stack[i+1]), true
|
|
|
case "export":
|
|
|
stack[i] = opExport(stack[i+1])
|
|
|
case "readlist":
|
|
|
@@ -231,7 +230,7 @@ func interpret(scanner *bufio.Scanner) value {
|
|
|
local[name] = stack[i+1+j]
|
|
|
}
|
|
|
env = append(env, val.env, local)
|
|
|
- stack[i] = opRun(value{val: val.body})
|
|
|
+ stack[i], _ = opRun(value{val: val.body})
|
|
|
env = env[:len(env)-2]
|
|
|
stack = stack[:i+1]
|
|
|
updated = true
|
|
|
@@ -247,9 +246,9 @@ func interpret(scanner *bufio.Scanner) value {
|
|
|
if len(stack) == stackTop {
|
|
|
stack = append(stack, value{val: "[ ]"})
|
|
|
}
|
|
|
- val := stack[len(stack)-1]
|
|
|
+ val = stack[len(stack)-1]
|
|
|
stack = stack[:stackTop]
|
|
|
- return val
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
func main() {
|