3 import mal_types
as types
4 from mal_types
import (MalSym
, MalInt
, MalStr
,
6 MalList
, _list
, MalVector
, MalHashMap
, MalFunc
)
11 return reader
.read_str(str)
14 def eval_ast(ast
, env
):
15 if types
._symbol
_Q
(ast
):
16 assert isinstance(ast
, MalSym
)
20 raise Exception(u
"'" + ast
.value
+ u
"' not found")
21 elif types
._list
_Q
(ast
):
24 res
.append(EVAL(a
, env
))
26 elif types
._vector
_Q
(ast
):
29 res
.append(EVAL(a
, env
))
31 elif types
._hash
_map
_Q
(ast
):
33 for k
in ast
.dct
.keys():
34 new_dct
[k
] = EVAL(ast
.dct
[k
], env
)
35 return MalHashMap(new_dct
)
37 return ast
# primitive value, return unchanged
40 #print("EVAL %s" % printer._pr_str(ast))
41 if not types
._list
_Q
(ast
):
42 return eval_ast(ast
, env
)
45 if len(ast
) == 0: return ast
46 el
= eval_ast(ast
, env
)
48 if isinstance(f
, MalFunc
):
49 return f
.apply(el
.values
[1:])
51 raise Exception("%s is not callable" % f
)
55 return printer
._pr
_str
(exp
)
60 return PRINT(EVAL(READ(str), env
))
63 a
, b
= args
[0], args
[1]
64 assert isinstance(a
, MalInt
)
65 assert isinstance(b
, MalInt
)
66 return MalInt(a
.value
+b
.value
)
68 a
, b
= args
[0], args
[1]
69 assert isinstance(a
, MalInt
)
70 assert isinstance(b
, MalInt
)
71 return MalInt(a
.value
-b
.value
)
73 a
, b
= args
[0], args
[1]
74 assert isinstance(a
, MalInt
)
75 assert isinstance(b
, MalInt
)
76 return MalInt(a
.value
*b
.value
)
78 a
, b
= args
[0], args
[1]
79 assert isinstance(a
, MalInt
)
80 assert isinstance(b
, MalInt
)
81 return MalInt(int(a
.value
/b
.value
))
82 repl_env
[u
'+'] = MalFunc(plus
)
83 repl_env
[u
'-'] = MalFunc(minus
)
84 repl_env
[u
'*'] = MalFunc(multiply
)
85 repl_env
[u
'/'] = MalFunc(divide
)
87 def entry_point(argv
):
90 line
= mal_readline
.readline("user> ")
91 if line
== "": continue
92 print(REP(line
, repl_env
))
97 except types
.MalException
as e
:
98 print(u
"Error: %s" % printer
._pr
_str
(e
.object, False))
99 except Exception as e
:
100 print("Error: %s" % e
)
101 #print("".join(traceback.format_exception(*sys.exc_info())))
104 # _____ Define and setup target ___
108 # Just run entry_point if not RPython compilation
110 if not sys
.argv
[0].endswith('rpython'):
111 entry_point(sys
.argv
)