1 $
: << File
.expand_path(File
.dirname(__FILE__
))
15 def eval_ast(ast
, env)
20 List
.new ast
.map
{|a
| EVAL(a
, env)}
22 Vector
.new ast
.map
{|a
| EVAL(a
, env)}
25 ast
.each
{|k
,v
| new_hm
[EVAL(k
,env)] = EVAL(v
, env)}
33 #puts "EVAL: #{_pr_str(ast, true)}"
36 return eval_ast(ast
, env)
43 return env.set(a1
, EVAL(a2
, env))
45 let_env
= Env
.new(env)
46 a1
.each_slice(2) do |a
,e
|
47 let_env
.set(a
, EVAL(e
, let_env
))
49 return EVAL(a2
, let_env
)
51 el
= eval_ast(ast
.drop(1), env)
56 return nil if a3
== nil
62 return lambda
{|*args
|
63 EVAL(a2
, Env
.new(env, a1
, args
))
66 el
= eval_ast(ast
, env)
74 return _pr_str(exp
, true)
79 RE
= lambda
{|str
| EVAL(READ(str
), repl_env
) }
80 REP
= lambda
{|str
| PRINT(EVAL(READ(str
), repl_env
)) }
82 # core.rb: defined using ruby
83 $core_ns.each
do |k
,v
| repl_env
.set(k
,v
) end
85 # core.mal: defined using the language itself
86 RE
["(def! not (fn* (a) (if a false true)))"]
89 while line
= _readline("user> ")
94 puts
"\t#{e.backtrace.join("\n\t")}"