4 import types
.MalException
14 eval_ast
= { ast
, env
->
16 case MalSymbol
: return env
.get(ast
);
17 case List
: return types
.vector_Q(ast
) ?
18 types
.vector(ast
.collect
{ EVAL(it
,env
) }) :
19 ast
.collect
{ EVAL(it
,env
) }
20 case Map
: def new_hm
= [:]
22 new_hm
[EVAL(k
, env
)] = EVAL(v
, env
)
30 //println("EVAL: ${printer.pr_str(ast,true)}")
31 if (! types
.list_Q(ast
)) return eval_ast(ast
, env
)
32 if (ast
.size() == 0) return ast
35 case { it
instanceof MalSymbol
&& it
.value
== "def!" }:
36 return env
.set(ast
[1], EVAL(ast
[2], env
))
37 case { it
instanceof MalSymbol
&& it
.value
== "let*" }:
38 def let_env
= new Env(env
)
39 for (int i
=0; i
< ast
[1].size(); i
+= 2) {
40 let_env
.set(ast
[1][i
], EVAL(ast
[1][i
+1], let_env
))
42 return EVAL(ast
[2], let_env
)
44 def el
= eval_ast(ast
, env
)
45 def (f
, args
) = [el
[0], el
[1..-1]]
52 printer
.pr_str exp
, true
57 repl_env
.set(new MalSymbol("+"), { a
-> a
[0]+a
[1]});
58 repl_env
.set(new MalSymbol("-"), { a
-> a
[0]-a
[1]});
59 repl_env
.set(new MalSymbol("*"), { a
-> a
[0]*a
[1]});
60 repl_env
.set(new MalSymbol("/"), { a
-> a
[0]/a
[1]}); // /
62 PRINT(EVAL(READ(str
), repl_env
))
66 line
= System
.console().readLine
'user> '
72 } catch(MalException ex
) {
73 println
"Error: ${printer.pr_str(ex.obj, true)}"