aboutsummaryrefslogtreecommitdiff
path: root/nim/step8_macros.nim
diff options
context:
space:
mode:
Diffstat (limited to 'nim/step8_macros.nim')
-rw-r--r--nim/step8_macros.nim14
1 files changed, 8 insertions, 6 deletions
diff --git a/nim/step8_macros.nim b/nim/step8_macros.nim
index 43c1cb4..96981a7 100644
--- a/nim/step8_macros.nim
+++ b/nim/step8_macros.nim
@@ -26,7 +26,7 @@ proc macroexpand(ast: MalType, env: Env): MalType =
let mac = env.get(result.list[0].str)
result = mac.malfun.fn(result.list[1 .. -1]).macroexpand(env)
-proc eval(ast: MalType, env: var Env): MalType
+proc eval(ast: MalType, env: Env): MalType
proc eval_ast(ast: MalType, env: var Env): MalType =
case ast.kind
@@ -43,18 +43,20 @@ proc eval_ast(ast: MalType, env: var Env): MalType =
else:
result = ast
-proc eval(ast: MalType, env: var Env): MalType =
+proc eval(ast: MalType, env: Env): MalType =
+ var ast = ast
+ var env = env
+
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)
@@ -104,7 +106,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":
@@ -126,7 +128,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()