3 import mal_types
as types
8 return reader
.read_str(str)
11 def eval_ast(ast
, env
):
12 if types
._symbol
_Q
(ast
):
16 raise Exception("'" + ast
+ "' not found")
17 elif types
._list
_Q
(ast
):
18 return types
._list
(*map(lambda a
: EVAL(a
, env
), ast
))
19 elif types
._vector
_Q
(ast
):
20 return types
._vector
(*map(lambda a
: EVAL(a
, env
), ast
))
21 elif types
._hash
_map
_Q
(ast
):
24 keyvals
.append(EVAL(k
, env
))
25 keyvals
.append(EVAL(ast
[k
], env
))
26 return types
._hash
_map
(*keyvals
)
28 return ast
# primitive value, return unchanged
31 #print("EVAL %s" % printer._pr_str(ast))
32 if not types
._list
_Q
(ast
):
33 return eval_ast(ast
, env
)
36 if len(ast
) == 0: return ast
37 el
= eval_ast(ast
, env
)
43 return printer
._pr
_str
(exp
)
48 return PRINT(EVAL(READ(str), repl_env
))
50 repl_env
['+'] = lambda a
,b
: a
+b
51 repl_env
['-'] = lambda a
,b
: a
-b
52 repl_env
['*'] = lambda a
,b
: a
*b
53 repl_env
['/'] = lambda a
,b
: int(a
/b
)
58 line
= mal_readline
.readline("user> ")
59 if line
== None: break
60 if line
== "": continue
62 except reader
.Blank
: continue
63 except Exception as e
:
64 print("".join(traceback
.format_exception(*sys
.exc_info())))