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)
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
))
51 ast
= a2
# Continue loop (TCO)
53 eval_ast(ast
[1..-2], env)
54 ast
= ast
.last
# Continue loop (TCO)
58 return nil if a3
== nil
59 ast
= a3
# Continue loop (TCO)
61 ast
= a2
# Continue loop (TCO)
64 return Function
.new(a2
, env, a1
) {|*args
|
65 EVAL(a2
, Env
.new(env, a1
, args
))
68 el
= eval_ast(ast
, env)
70 if f
.class == Function
72 env = f
.gen_env(el
.drop(1)) # Continue loop (TCO)
83 return _pr_str(exp
, true)
88 RE
= lambda
{|str
| EVAL(READ(str
), repl_env
) }
89 REP
= lambda
{|str
| PRINT(EVAL(READ(str
), repl_env
)) }
91 # core.rb: defined using ruby
92 $core_ns.each
do |k
,v
| repl_env
.set(k
,v
) end
94 # core.mal: defined using the language itself
95 RE
["(def! not (fn* (a) (if a false true)))"]
98 while line
= _readline("user> ")
101 rescue Exception
=> e
103 puts
"\t#{e.backtrace.join("\n\t")}"