|
@@ -176,7 +176,7 @@ func interpret(scanner *bufio.Scanner) (val value, returned bool) {
|
|
|
case "isempty":
|
|
case "isempty":
|
|
|
stack[i] = opIsEmpty(stack[i+1])
|
|
stack[i] = opIsEmpty(stack[i+1])
|
|
|
case "return":
|
|
case "return":
|
|
|
- stack[i], returned = opReturn(stack[i+1]), true
|
|
|
|
|
|
|
+ stack[i], returned = stack[i+1], true
|
|
|
case "export":
|
|
case "export":
|
|
|
stack[i] = opExport(stack[i+1])
|
|
stack[i] = opExport(stack[i+1])
|
|
|
case "readlist":
|
|
case "readlist":
|
|
@@ -227,7 +227,7 @@ func interpret(scanner *bufio.Scanner) (val value, returned bool) {
|
|
|
}
|
|
}
|
|
|
local := environ{stack[i].val: val}
|
|
local := environ{stack[i].val: val}
|
|
|
for j, name := range val.param {
|
|
for j, name := range val.param {
|
|
|
- local[name] = stack[i+1+j]
|
|
|
|
|
|
|
+ local[name] = wrapFunc(stack[i+1+j])
|
|
|
}
|
|
}
|
|
|
env = append(env, val.env, local)
|
|
env = append(env, val.env, local)
|
|
|
stack[i], _ = opRun(value{val: val.list[1]})
|
|
stack[i], _ = opRun(value{val: val.list[1]})
|
|
@@ -246,7 +246,7 @@ func interpret(scanner *bufio.Scanner) (val value, returned bool) {
|
|
|
if len(stack) == stackTop {
|
|
if len(stack) == stackTop {
|
|
|
stack = append(stack, value{val: "[ ]"})
|
|
stack = append(stack, value{val: "[ ]"})
|
|
|
}
|
|
}
|
|
|
- val = opReturn(stack[len(stack)-1])
|
|
|
|
|
|
|
+ val = wrapFunc(stack[len(stack)-1])
|
|
|
stack = stack[:stackTop]
|
|
stack = stack[:stackTop]
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
@@ -255,6 +255,14 @@ func main() {
|
|
|
rand.Seed(time.Now().UnixNano())
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
env = append(env, nil, map[string]value{"pi": {val: "3.14159"}})
|
|
env = append(env, nil, map[string]value{"pi": {val: "3.14159"}})
|
|
|
|
|
|
|
|
|
|
+ if len(os.Args) > 1 {
|
|
|
|
|
+ file, err := os.Open(os.Args[1])
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ panic(fmt.Errorf("mua: %s (%s)", errFileError, os.Args[1]))
|
|
|
|
|
+ }
|
|
|
|
|
+ os.Stdin = file
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
scanner := bufio.NewScanner(os.Stdin)
|
|
scanner := bufio.NewScanner(os.Stdin)
|
|
|
interpret(scanner)
|
|
interpret(scanner)
|
|
|
}
|
|
}
|