1 require_relative
"mal_readline"
2 require_relative
"types"
3 require_relative
"reader"
4 require_relative
"printer"
13 def eval_ast(ast
, env)
18 List
.new ast
.map
{|a
| EVAL(a
, env)}
20 Vector
.new ast
.map
{|a
| EVAL(a
, env)}
23 ast
.each
{|k
,v
| new_hm
[EVAL(k
,env)] = EVAL(v
, env)}
31 #puts "EVAL: #{_pr_str(ast, true)}"
34 return eval_ast(ast
, env)
44 return env.set(a1
, EVAL(a2
, env))
46 let_env
= Env
.new(env)
47 a1
.each_slice(2) do |a
,e
|
48 let_env
.set(a
, EVAL(e
, let_env
))
50 return EVAL(a2
, let_env
)
52 el
= eval_ast(ast
, env)
60 return _pr_str(exp
, true)
65 REP
= lambda
{|str
| PRINT(EVAL(READ(str
), repl_env
)) }
67 repl_env
.set(:+, lambda
{|a
,b
| a
+ b
})
68 repl_env
.set(:-, lambda
{|a
,b
| a
- b
})
69 repl_env
.set(:*, lambda
{|a
,b
| a
* b
})
70 repl_env
.set(:/, lambda {|a,b| a / b
})
73 while line
= _readline("user> ")
78 puts
"\t#{e.backtrace.join("\n\t")}"