|
@@ -48,9 +48,9 @@ func interpret(scanner *scanProvider, envs []environ) (val value, returned bool)
|
|
|
}
|
|
}
|
|
|
if s[0] == ':' {
|
|
if s[0] == ':' {
|
|
|
leading := len(s) - len(strings.TrimLeft(s, ":"))
|
|
leading := len(s) - len(strings.TrimLeft(s, ":"))
|
|
|
- val := toValue(value{word: `"` + s[leading:]}, envs[0])
|
|
|
|
|
|
|
+ val := toValue(value{word: `"` + s[leading:]}, envs)
|
|
|
for i := 0; i < leading; i++ {
|
|
for i := 0; i < leading; i++ {
|
|
|
- val = toValue(opThing(val, envs), envs[0])
|
|
|
|
|
|
|
+ val = toValue(opThing(val, envs), envs)
|
|
|
}
|
|
}
|
|
|
stack = append(stack, val)
|
|
stack = append(stack, val)
|
|
|
} else if s[0] == '[' && !scanner.isList {
|
|
} else if s[0] == '[' && !scanner.isList {
|
|
@@ -103,7 +103,7 @@ func interpret(scanner *scanProvider, envs []environ) (val value, returned bool)
|
|
|
}
|
|
}
|
|
|
if paramCnt == len(stack)-1-i {
|
|
if paramCnt == len(stack)-1-i {
|
|
|
for j := i + 1; j < len(stack); j++ {
|
|
for j := i + 1; j < len(stack); j++ {
|
|
|
- stack[j] = toValue(stack[j], envs[0])
|
|
|
|
|
|
|
+ stack[j] = toValue(stack[j], envs)
|
|
|
}
|
|
}
|
|
|
switch stack[i].word {
|
|
switch stack[i].word {
|
|
|
case "make":
|
|
case "make":
|
|
@@ -200,13 +200,21 @@ func interpret(scanner *scanProvider, envs []environ) (val value, returned bool)
|
|
|
if val.param != nil {
|
|
if val.param != nil {
|
|
|
if len(val.param) == len(stack)-1-i {
|
|
if len(val.param) == len(stack)-1-i {
|
|
|
for j := i + 1; j < len(stack); j++ {
|
|
for j := i + 1; j < len(stack); j++ {
|
|
|
- stack[j] = toValue(stack[j], envs[0])
|
|
|
|
|
|
|
+ stack[j] = toValue(stack[j], envs)
|
|
|
}
|
|
}
|
|
|
local := environ{stack[i].word: val}
|
|
local := environ{stack[i].word: val}
|
|
|
for j, name := range val.param {
|
|
for j, name := range val.param {
|
|
|
local[name] = stack[i+1+j]
|
|
local[name] = stack[i+1+j]
|
|
|
}
|
|
}
|
|
|
- stack[i], _ = opRun(value{tp: typeList, list: val.body}, []environ{local, val.env, envs[2]})
|
|
|
|
|
|
|
+ ctx := environ{}
|
|
|
|
|
+ for name, val := range val.env {
|
|
|
|
|
+ ctx[name] = val
|
|
|
|
|
+ }
|
|
|
|
|
+ global := envs[0]
|
|
|
|
|
+ if envs[2] != nil {
|
|
|
|
|
+ global = envs[2]
|
|
|
|
|
+ }
|
|
|
|
|
+ stack[i], _ = opRun(value{tp: typeList, list: val.body}, []environ{local, ctx, global})
|
|
|
stack = stack[:i+1]
|
|
stack = stack[:i+1]
|
|
|
updated = true
|
|
updated = true
|
|
|
}
|
|
}
|
|
@@ -219,7 +227,7 @@ func interpret(scanner *scanProvider, envs []environ) (val value, returned bool)
|
|
|
if len(stack) == 0 {
|
|
if len(stack) == 0 {
|
|
|
val = value{tp: typeList, list: []string{}}
|
|
val = value{tp: typeList, list: []string{}}
|
|
|
} else {
|
|
} else {
|
|
|
- val = toValue(stack[len(stack)-1], envs[0])
|
|
|
|
|
|
|
+ val = toValue(stack[len(stack)-1], envs)
|
|
|
}
|
|
}
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
@@ -236,5 +244,5 @@ func main() {
|
|
|
}
|
|
}
|
|
|
scanner := bufio.NewScanner(os.Stdin)
|
|
scanner := bufio.NewScanner(os.Stdin)
|
|
|
scanner.Split(splitFunc)
|
|
scanner.Split(splitFunc)
|
|
|
- interpret(&scanProvider{isList: false, scanner: scanner}, []environ{env, nil, env})
|
|
|
|
|
|
|
+ interpret(&scanProvider{isList: false, scanner: scanner}, []environ{env, nil, nil})
|
|
|
}
|
|
}
|