3 import mal_types
as types
9 return reader
.read_str(str)
12 def eval_ast(ast
, env
):
13 if types
._symbol
_Q
(ast
):
15 elif types
._list
_Q
(ast
):
16 return types
._list
(*map(lambda a
: EVAL(a
, env
), ast
))
17 elif types
._vector
_Q
(ast
):
18 return types
._vector
(*map(lambda a
: EVAL(a
, env
), ast
))
19 elif types
._hash
_map
_Q
(ast
):
22 keyvals
.append(EVAL(k
, env
))
23 keyvals
.append(EVAL(ast
[k
], env
))
24 return types
._hash
_map
(*keyvals
)
26 return ast
# primitive value, return unchanged
29 #print("EVAL %s" % printer._pr_str(ast))
30 if not types
._list
_Q
(ast
):
31 return eval_ast(ast
, env
)
34 if len(ast
) == 0: return ast
38 a1
, a2
= ast
[1], ast
[2]
40 return env
.set(a1
, res
)
42 a1
, a2
= ast
[1], ast
[2]
44 for i
in range(0, len(a1
), 2):
45 let_env
.set(a1
[i
], EVAL(a1
[i
+1], let_env
))
46 return EVAL(a2
, let_env
)
48 el
= eval_ast(ast
, env
)
54 return printer
._pr
_str
(exp
)
59 return PRINT(EVAL(READ(str), repl_env
))
61 repl_env
.set(types
._symbol
('+'), lambda a
,b
: a
+b
)
62 repl_env
.set(types
._symbol
('-'), lambda a
,b
: a
-b
)
63 repl_env
.set(types
._symbol
('*'), lambda a
,b
: a
*b
)
64 repl_env
.set(types
._symbol
('/'), lambda a
,b
: int(a
/b
))
69 line
= mal_readline
.readline("user> ")
70 if line
== None: break
71 if line
== "": continue
73 except reader
.Blank
: continue
74 except Exception as e
:
75 print("".join(traceback
.format_exception(*sys
.exc_info())))