12 Val
eval_ast(Val ast
, Env env
)
19 return List(map(ast.data
, lambda(Val e
) { return EVAL(e
, env
); }));
21 return Vector(map(ast.data
, lambda(Val e
) { return EVAL(e
, env
); }));
23 array(Val
) elements
= ({ });
24 foreach(ast.data
; Val k
; Val v
)
26 elements
+= ({ k
, EVAL(v
, env
) });
34 Val
EVAL(Val ast
, Env env
)
36 if(ast.mal_type
!= MALTYPE_LIST
) return eval_ast(ast
, env
);
37 if(ast.
emptyp()) return ast
;
38 if(ast.data
[0].mal_type
== MALTYPE_SYMBOL
) {
39 switch(ast.data
[0].value
)
42 return env.
set(ast.data
[1], EVAL(ast.data
[2], env
));
44 Env let_env
= Env(env
);
45 Val ast1
= ast.data
[1];
46 for(int i
= 0; i
< sizeof(ast1.data
); i
+= 2)
48 let_env.
set(ast1.data
[i
], EVAL(ast1.data
[i
+ 1], let_env
));
50 return EVAL(ast.data
[2], let_env
);
53 foreach(ast.data
[1..
], Val element
)
55 result
= EVAL(element
, env
);
59 Val cond
= EVAL(ast.data
[1], env
);
60 if(cond.mal_type
== MALTYPE_FALSE || cond.mal_type
== MALTYPE_NIL
)
62 if(sizeof(ast.data
) > 3)
63 return EVAL(ast.data
[3], env
);
68 return EVAL(ast.data
[2], env
);
70 return lambda(Val ... a
) { return EVAL(ast.data
[2], Env(env
, ast.data
[1], List(a
))); };
73 Val evaled_ast
= eval_ast(ast
, env
);
74 Val f
= evaled_ast.data
[0];
75 return f(@evaled_ast.data
[1..
]);
80 return pr_str(exp, true
);
83 string rep(string str
, Env env
)
85 return PRINT(EVAL(READ(str
), env
));
90 Env repl_env
= Env(0);
91 foreach(.Core.
NS(); Val k
; Val v
) repl_env.
set(k
, v
);
92 rep("(def! not (fn* (a) (if a false true)))", repl_env
);
95 string line
= readline("user> ");
97 if(strlen(line
) == 0) continue;
98 if(mixed err
= catch { write(({ rep(line
, repl_env
), "\n" })); } )
100 if(arrayp(err
)) err
= err
[0];
101 write(({ "Error: ", err
, "\n" }));