diff options
Diffstat (limited to 'nim/step7_quote.nim')
| -rw-r--r-- | nim/step7_quote.nim | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/nim/step7_quote.nim b/nim/step7_quote.nim index 58fc3b6..848913d 100644 --- a/nim/step7_quote.nim +++ b/nim/step7_quote.nim @@ -34,20 +34,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 @@ -83,7 +83,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": @@ -105,7 +105,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() |
