Browse Source

FIX.多层嵌套可以外层变量

RegMs If 4 năm trước cách đây
mục cha
commit
3ab760c18c
5 tập tin đã thay đổi với 79 bổ sung12 xóa
  1. 2 2
      bind.go
  2. 1 1
      conv.go
  3. 67 0
      in0
  4. BIN
      mua
  5. 9 9
      mua.go

+ 2 - 2
bind.go

@@ -107,8 +107,8 @@ func opExport(val1 value, envs []environ) value {
 	name := toName(val1)
 	val, ok := envs[0][name]
 	if ok {
-		if envs[2] != nil {
-			envs[2][name] = val
+		if envs[1] != nil {
+			envs[1][name] = val
 		}
 		return val
 	}

+ 1 - 1
conv.go

@@ -226,7 +226,7 @@ func parseFunc(s string, envs []environ) *_list {
 		}
 	}
 	local := environ{}
-	if envs[2] != nil {
+	if envs[1] != nil {
 		for name, val := range envs[0] {
 			local[name] = val
 		}

+ 67 - 0
in0

@@ -1,3 +1,70 @@
+make "a [
+  [b]
+  [
+    make "c 1
+    make "d [
+      []
+      [
+        make "e 2
+        make "f [
+          []
+          [
+            make "g 3
+            make "h [
+              []
+              [
+                return thing :b
+              ]
+            ]
+            return h
+          ]
+        ]
+        return f
+      ]
+    ]
+    return d
+  ]
+]
+
+print a "c
+print a "e
+print a "g
+
+make "i [
+  []
+  [
+    make "j 4
+    make "k [
+      []
+      [
+        make "l 5
+        make "m [
+          []
+          [
+            make "n 6
+            make "o [
+              [p]
+              [
+                return thing :p
+              ]
+            ]
+            return :o
+          ]
+        ]
+        return :m
+      ]
+    ]
+    return :k
+  ]
+]
+
+make "q i
+make "r q
+make "s r
+print s "j
+print s "l
+print s "n
+
 make "fact_base [
   [rec x]
   [

BIN
mua


+ 9 - 9
mua.go

@@ -189,19 +189,19 @@ func interpret(scanner *scanProvider, envs []environ) (val value, returned bool)
 						for j := i + 1; j < len(stack); j++ {
 							stack[j] = toValue(stack[j], envs)
 						}
-						local := environ{op: val}
+						local := environ{}
+						for name, val := range val.env {
+							local[name] = val
+						}
+						local[op] = val
 						for j, name := range val.param {
 							local[name] = stack[i+1+j]
 						}
-						ctx := environ{}
-						for name, val := range val.env {
-							ctx[name] = val
-						}
 						global := envs[0]
-						if envs[2] != nil {
-							global = envs[2]
+						if envs[1] != nil {
+							global = envs[1]
 						}
-						stack[i], _ = opRun(&_list{list: val.body}, []environ{local, ctx, global})
+						stack[i], _ = opRun(&_list{list: val.body}, []environ{local, global})
 						stack = stack[:i+1]
 						updated = true
 					}
@@ -231,5 +231,5 @@ func main() {
 	}
 	scanner := bufio.NewScanner(os.Stdin)
 	scanner.Split(splitFunc)
-	interpret(&scanProvider{isList: false, scanner: scanner}, []environ{env, nil, nil})
+	interpret(&scanProvider{isList: false, scanner: scanner}, []environ{env, nil})
 }