3 from mal_types
import (pr_str
, sequential_Q
, symbol_Q
, coll_Q
, list_Q
,
4 vector_Q
, hash_map_Q
, new_symbol
, new_function
,
5 new_list
, new_vector
, new_hash_map
, Env
, types_ns
)
6 from reader
import (read_str
, Blank
)
13 def eval_ast(ast
, env
):
17 return new_list(*map(lambda a
: EVAL(a
, env
), ast
))
19 return new_vector(*map(lambda a
: EVAL(a
, env
), ast
))
23 keyvals
.append(EVAL(k
, env
))
24 keyvals
.append(EVAL(ast
[k
], env
))
25 return new_hash_map(*keyvals
)
27 return ast
# primitive value, return unchanged
31 #print("EVAL %s" % ast)
33 return eval_ast(ast
, env
)
36 if len(ast
) == 0: return ast
40 a1
, a2
= ast
[1], ast
[2]
42 return env
.set(a1
, res
)
44 a1
, a2
= ast
[1], ast
[2]
46 for i
in range(0, len(a1
), 2):
47 let_env
.set(a1
[i
], EVAL(a1
[i
+1], let_env
))
48 return EVAL(a2
, let_env
)
50 eval_ast(ast
[1:-1], env
)
54 a1
, a2
= ast
[1], ast
[2]
56 if cond
is None or cond
is False:
57 if len(ast
) > 3: ast
= ast
[3]
63 a1
, a2
= ast
[1], ast
[2]
64 return new_function(EVAL
, a2
, env
, a1
)
66 el
= eval_ast(ast
, env
)
68 if hasattr(f
, '__meta__') and f
.__meta
__.has_key("exp"):
71 env
= Env(m
['env'], m
['params'], el
[1:])
82 return PRINT(EVAL(READ(str), repl_env
))
83 def _ref(k
,v
): repl_env
.set(k
, v
)
85 # Import types functions
86 for name
, val
in types_ns
.items(): _ref(name
, val
)
88 _ref('read-string', read_str
)
89 _ref('eval', lambda ast
: EVAL(ast
, repl_env
))
90 _ref('slurp', lambda file: open(file).read())
92 # Defined using the language itself
93 REP("(def! not (fn* (a) (if a false true)))")
94 REP("(def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \")\")))))")
96 if len(sys
.argv
) >= 2:
97 REP('(load-file "' + sys
.argv
[1] + '")')
101 line
= mal_readline
.readline("user> ")
102 if line
== None: break
103 if line
== "": continue
105 except Blank
: continue
106 except Exception as e
:
107 print "".join(traceback
.format_exception(*sys
.exc_info()))