فهرست منبع

FIX. 修复list作为函数参数时环境缺失

RegMs If 4 سال پیش
والد
کامیت
8f072fe751
6فایلهای تغییر یافته به همراه28 افزوده شده و 20 حذف شده
  1. 8 4
      bind.go
  2. 0 7
      ctrl.go
  3. 5 2
      in
  4. 4 4
      list.go
  5. BIN
      mua
  6. 11 3
      mua.go

+ 8 - 4
bind.go

@@ -29,6 +29,13 @@ func parseFunc(s string) value {
 	return value{val: s, list: list, param: param, env: local}
 }
 
+func wrapFunc(val value) value {
+	if isList(val.val) && val.list == nil {
+		return parseFunc(val.val)
+	}
+	return val
+}
+
 func getFunc(name string) value {
 	if !isName(`"` + name) {
 		return value{}
@@ -67,10 +74,7 @@ func opMake(val1, val2 value) value {
 		}
 		val2 = value{val: assign(val.val, index, val2.val)}
 	}
-	if isList(val2.val) && val2.list == nil {
-		val2 = parseFunc(val2.val)
-	}
-	env[len(env)-1][name] = val2
+	env[len(env)-1][name] = wrapFunc(val2)
 	return val2
 }
 

+ 0 - 7
ctrl.go

@@ -20,10 +20,3 @@ func opIf(val1, val2, val3 value) (value, bool) {
 	}
 	return opRun(val3)
 }
-
-func opReturn(val1 value) value {
-	if isList(val1.val) && val1.list == nil {
-		val1 = parseFunc(val1.val)
-	}
-	return val1
-}

+ 5 - 2
in

@@ -8,7 +8,10 @@ make "fun [
   ]
 ]
 make "adder fun [[x y] [add :x :y]]
-print adder 2 3
+print adder 2 "3
+make "imply fun [[x y] [or not :x :y]]
+print imply "true false
+print imply true true
 
 make "arr [ [ a b ] c ]
 print :arr[0]
@@ -66,7 +69,7 @@ make "reverse_list [
   [list]
   [if isempty :list [] [join reverse_list butfirst :list first :list]]
 ]
-print reverse_list [a [b c d] [e f] g]
+print reverse_list [a b c d [e f] g]
 
 make "fib_wrap [
   [x]

+ 4 - 4
list.go

@@ -5,10 +5,6 @@ import (
 	"strings"
 )
 
-func wrapList(list []string) []string {
-	return append(append([]string{"["}, list...), "]")
-}
-
 func parseList(s string) []string {
 	if !isList(s) {
 		panic(fmt.Errorf("parselist: %s (%s)", errListExpected, s))
@@ -29,6 +25,10 @@ func parseList(s string) []string {
 	return resList
 }
 
+func wrapList(list []string) []string {
+	return append(append([]string{"["}, list...), "]")
+}
+
 func indexOfList(list []string, index int) string {
 	if index < 0 || index >= len(list) {
 		panic(fmt.Errorf("indexoflist: %s", errIndexOutOfBound))


+ 11 - 3
mua.go

@@ -176,7 +176,7 @@ func interpret(scanner *bufio.Scanner) (val value, returned bool) {
 						case "isempty":
 							stack[i] = opIsEmpty(stack[i+1])
 						case "return":
-							stack[i], returned = opReturn(stack[i+1]), true
+							stack[i], returned = stack[i+1], true
 						case "export":
 							stack[i] = opExport(stack[i+1])
 						case "readlist":
@@ -227,7 +227,7 @@ func interpret(scanner *bufio.Scanner) (val value, returned bool) {
 						}
 						local := environ{stack[i].val: val}
 						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)
 						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 {
 		stack = append(stack, value{val: "[ ]"})
 	}
-	val = opReturn(stack[len(stack)-1])
+	val = wrapFunc(stack[len(stack)-1])
 	stack = stack[:stackTop]
 	return
 }
@@ -255,6 +255,14 @@ func main() {
 	rand.Seed(time.Now().UnixNano())
 	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)
 	interpret(scanner)
 }