Bladeren bron

FIX.修复布尔字面量被当作函数的问题

RegMs If 4 jaren geleden
bovenliggende
commit
e4fa3520a4
5 gewijzigde bestanden met toevoegingen van 31 en 17 verwijderingen
  1. 2 2
      error.go
  2. 3 3
      io.go
  3. BIN
      mua
  4. 8 6
      mua.go
  5. 18 6
      type.go

+ 2 - 2
error.go

@@ -26,12 +26,12 @@ const errWordExpceted = "word expected"
 
 const errListExpected = "list expected"
 
+const errFunctionExpected = "function expected"
+
 const errWordOrListExpected = "word or list expected"
 
 const errEmptyWordOrList = "empty word or list"
 
-const errFunctionExpected = "function expected"
-
 const errIndexOutOfBound = "index out of bound"
 
 const errIllegalRange = "illegal range"

+ 3 - 3
io.go

@@ -19,9 +19,11 @@ func opRead(scanner *scanProvider) value {
 func opPrint(val1 value) value {
 	if val1.tp == typeNumber {
 		fmt.Println(val1.num)
+	} else if val1.tp == typeBool {
+		fmt.Println(val1.b)
 	} else if val1.tp == typeWord {
 		fmt.Println(escapeWord(val1.word[1:]))
-	} else if val1.tp == typeList {
+	} else {
 		list, space := strings.Split(makeList(val1.list), " "), false
 		for i := 0; i < len(list); i++ {
 			if space && list[i] != "]" {
@@ -31,8 +33,6 @@ func opPrint(val1 value) value {
 			space = list[i] != "["
 		}
 		fmt.Println()
-	} else {
-		fmt.Println(val1.b)
 	}
 	return val1
 }


+ 8 - 6
mua.go

@@ -18,7 +18,8 @@ var reserved = map[string]int{
 	"export": 1, "readlist": 0, "word": 2, "sentence": 2, "list": 2,
 	"join": 2, "first": 1, "last": 1, "butfirst": 1, "butlast": 1,
 	"random": 1, "int": 1, "sqrt": 1, "save": 1, "load": 1,
-	"erall": 0, "poall": 0}
+	"erall": 0, "poall": 0,
+	"false": 0, "true": 0}
 
 type environ map[string]value
 type value struct {
@@ -88,14 +89,18 @@ func interpret(scanner *scanProvider, envs []environ) (val value, returned bool)
 		} else {
 			stack = append(stack, value{word: s})
 		}
-		for !returned {
-			updated := false
+		updated := true
+		for !returned && updated {
+			updated = false
 			for i := len(stack) - 1; i >= 0; i-- {
 				if !isName(value{word: `"` + stack[i].word}) {
 					continue
 				}
 				paramCnt, ok := reserved[stack[i].word]
 				if ok {
+					if stack[i].word == "false" || stack[i].word == "true" {
+						continue
+					}
 					if paramCnt == len(stack)-1-i {
 						for j := i + 1; j < len(stack); j++ {
 							stack[j] = toValue(stack[j], envs[0])
@@ -209,9 +214,6 @@ func interpret(scanner *scanProvider, envs []environ) (val value, returned bool)
 				}
 				panic(fmt.Errorf("func: %s (%s)", errFunctionExpected, stack[i].word))
 			}
-			if !updated {
-				break
-			}
 		}
 	}
 	if len(stack) == 0 {

+ 18 - 6
type.go

@@ -83,7 +83,7 @@ func isBool(val value) bool {
 	if isWord(val) {
 		val.word = val.word[1:]
 	}
-	return val.word == "true" || val.word == "false"
+	return val.word == "false" || val.word == "true"
 }
 
 func toBool(val value) bool {
@@ -96,10 +96,10 @@ func toBool(val value) bool {
 	if isWord(val) {
 		val.word = val.word[1:]
 	}
-	if val.word != "true" && val.word != "false" {
-		panic(fmt.Errorf("bool: %s (%s)", errInvalidBool, toString(val)))
+	if val.word == "false" || val.word == "true" {
+		return val.word == "true"
 	}
-	return val.word == "true"
+	panic(fmt.Errorf("bool: %s (%s)", errInvalidBool, toString(val)))
 }
 
 func isWord(val value) bool {
@@ -110,7 +110,7 @@ func isWord(val value) bool {
 }
 
 func parseWord(s string) value {
-	if len(s) > 1 {
+	if s != `"` {
 		if s[1] == '[' {
 			s = `"\[` + s[2:]
 		}
@@ -195,7 +195,7 @@ func isEmpty(val value) bool {
 	if val.tp == typeList {
 		return len(val.list) == 0
 	}
-	panic(fmt.Errorf("empty: %s (%s)", errWordOrListExpected, toString(val)))
+	return val.word == `"` || val.word == "[ ]"
 }
 
 func toValue(val value, env environ) value {
@@ -203,9 +203,15 @@ func toValue(val value, env environ) value {
 		return val
 	}
 	if isNumber(val) {
+		if isWord(val) {
+			return value{tp: typeNumber, word: val.word, num: toNumber(val)}
+		}
 		return value{tp: typeNumber, num: toNumber(val)}
 	}
 	if isBool(val) {
+		if isWord(val) {
+			return value{tp: typeBool, word: val.word, b: toBool(val)}
+		}
 		return value{tp: typeBool, b: toBool(val)}
 	}
 	if isWord(val) {
@@ -219,9 +225,15 @@ func toValue(val value, env environ) value {
 
 func toString(val value) string {
 	if val.tp == typeNumber {
+		if val.word != "" {
+			return val.word[1:]
+		}
 		return strconv.FormatFloat(val.num, 'g', -1, 64)
 	}
 	if val.tp == typeBool {
+		if val.word != "" {
+			return val.word[1:]
+		}
 		return strconv.FormatBool(val.b)
 	}
 	if val.tp == typeWord {