Quellcode durchsuchen

FIX. 修复run时return不会退出函数

RegMs If vor 4 Jahren
Ursprung
Commit
6e97300346
3 geänderte Dateien mit 24 neuen und 17 gelöschten Zeilen
  1. 2 2
      ctrl.go
  2. 15 7
      in
  3. 7 8
      mua.go

+ 2 - 2
ctrl.go

@@ -6,14 +6,14 @@ import (
 	"strings"
 )
 
-func opRun(val1 value) value {
+func opRun(val1 value) (value, bool) {
 	if !isList(val1.val) {
 		panic(fmt.Errorf("run: %s (%s)", errListExpected, val1.val))
 	}
 	return interpret(bufio.NewScanner(strings.NewReader(val1.val[1 : len(val1.val)-1])))
 }
 
-func opIf(val1, val2, val3 value) value {
+func opIf(val1, val2, val3 value) (value, bool) {
 	b1 := toBool(val1.val)
 	if b1 {
 		return opRun(val2)

+ 15 - 7
in

@@ -1,9 +1,19 @@
-print load "test
-print fib_out 3
+make "pow [[a b] [
+  if lt :b 1 [
+    return 1
+  ] [
+    make "r pow :a div sub :b mod :b 2 2
+    make "r mul :r :r
+    if mod :b 2 [
+      return mul :r :a
+    ] [
+      return :r
+    ]
+    print :r
+  ]
+]]
 
-print poall
-print erall
-print poall
+print pow 2 18
 
 print readlist
 a b c 1 2 3
@@ -99,5 +109,3 @@ make "test [
 ]
 test
 print :x
-
-print save "test

+ 7 - 8
mua.go

@@ -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() {