aboutsummaryrefslogtreecommitdiff
path: root/nim/step5_tco.nim
diff options
context:
space:
mode:
Diffstat (limited to 'nim/step5_tco.nim')
-rw-r--r--nim/step5_tco.nim12
1 files changed, 6 insertions, 6 deletions
diff --git a/nim/step5_tco.nim b/nim/step5_tco.nim
index a03dbd1..bbbb160 100644
--- a/nim/step5_tco.nim
+++ b/nim/step5_tco.nim
@@ -20,20 +20,20 @@ proc eval_ast(ast: MalType, env: var Env): MalType =
result = ast
proc eval(ast: MalType, env: var Env): MalType =
+ var ast = ast
+
template defaultApply =
let el = ast.eval_ast(env)
let f = el.list[0]
case f.kind
of MalFun:
ast = f.malfun.ast
- env = initEnv(env, f.malfun.params, list(el.list[1 .. -1]))
+ env = initEnv(f.malfun.env, f.malfun.params, list(el.list[1 .. -1]))
else:
return f.fun(el.list[1 .. -1])
- var ast = ast
while true:
- if ast.kind != List:
- return ast.eval_ast(env)
+ if ast.kind != List: return ast.eval_ast(env)
let a0 = ast.list[0]
case a0.kind
@@ -62,7 +62,7 @@ proc eval(ast: MalType, env: var Env): MalType =
of "do":
let last = ast.list.high
let el = (list ast.list[1 .. <last]).eval_ast(env)
- ast = ast.list[last].eval(env)
+ ast = ast.list[last]
# Continue loop (TCO)
of "if":
@@ -84,7 +84,7 @@ proc eval(ast: MalType, env: var Env): MalType =
let fn = proc(a: varargs[MalType]): MalType =
var newEnv = initEnv(env2, a1, list(a))
a2.eval(newEnv)
- return malfun(fn, a2, a1, env2)
+ return malfun(fn, a2, a1, env)
else:
defaultApply()