diff options
Diffstat (limited to 'nim/step5_tco.nim')
| -rw-r--r-- | nim/step5_tco.nim | 12 |
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() |
