1 require_relative
"mal_readline"
2 require_relative
"types"
3 require_relative
"reader"
4 require_relative
"printer"
6 require_relative
"core"
14 def eval_ast(ast
, env)
19 List
.new ast
.map
{|a
| EVAL(a
, env)}
21 Vector
.new ast
.map
{|a
| EVAL(a
, env)}
24 ast
.each
{|k
,v
| new_hm
[EVAL(k
,env)] = EVAL(v
, env)}
34 #puts "EVAL: #{_pr_str(ast, true)}"
37 return eval_ast(ast
, env)
47 return env.set(a1
, EVAL(a2
, env))
49 let_env
= Env
.new(env)
50 a1
.each_slice(2) do |a
,e
|
51 let_env
.set(a
, EVAL(e
, let_env
))
54 ast
= a2
# Continue loop (TCO)
56 eval_ast(ast
[1..-2], env)
57 ast
= ast
.last
# Continue loop (TCO)
61 return nil if a3
== nil
62 ast
= a3
# Continue loop (TCO)
64 ast
= a2
# Continue loop (TCO)
67 return Function
.new(a2
, env, a1
) {|*args
|
68 EVAL(a2
, Env
.new(env, a1
, List
.new(args
)))
71 el
= eval_ast(ast
, env)
73 if f
.class == Function
75 env = f
.gen_env(el
.drop(1)) # Continue loop (TCO)
86 return _pr_str(exp
, true)
91 RE
= lambda
{|str
| EVAL(READ(str
), repl_env
) }
92 REP
= lambda
{|str
| PRINT(EVAL(READ(str
), repl_env
)) }
94 # core.rb: defined using ruby
95 $core_ns.each
do |k
,v
| repl_env
.set(k
,v
) end
97 # core.mal: defined using the language itself
98 RE
["(def! not (fn* (a) (if a false true)))"]
101 while line
= _readline("user> ")
104 rescue Exception
=> e
106 puts
"\t#{e.backtrace[0..100].join("\n\t")}"