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 el
= eval_ast(ast
, env
)
47 if isinstance(f
, MalFunc
):
48 return f
.apply(el
.values
[1:])
50 raise Exception("%s is not callable" % f
)
54 return printer
._pr
_str
(exp
)
59 return PRINT(EVAL(READ(str), env
))
62 a
, b
= args
[0], args
[1]
63 assert isinstance(a
, MalInt
)
64 assert isinstance(b
, MalInt
)
65 return MalInt(a
.value
+b
.value
)
67 a
, b
= args
[0], args
[1]
68 assert isinstance(a
, MalInt
)
69 assert isinstance(b
, MalInt
)
70 return MalInt(a
.value
-b
.value
)
72 a
, b
= args
[0], args
[1]
73 assert isinstance(a
, MalInt
)
74 assert isinstance(b
, MalInt
)
75 return MalInt(a
.value
*b
.value
)
77 a
, b
= args
[0], args
[1]
78 assert isinstance(a
, MalInt
)
79 assert isinstance(b
, MalInt
)
80 return MalInt(int(a
.value
/b
.value
))
81 repl_env
[u
'+'] = MalFunc(plus
)
82 repl_env
[u
'-'] = MalFunc(minus
)
83 repl_env
[u
'*'] = MalFunc(multiply
)
84 repl_env
[u
'/'] = MalFunc(divide
)
86 def entry_point(argv
):
89 line
= mal_readline
.readline("user> ")
90 if line
== "": continue
91 print(REP(line
, repl_env
))
96 except types
.MalException
as e
:
97 print(u
"Error: %s" % printer
._pr
_str
(e
.object, False))
98 except Exception as e
:
99 print("Error: %s" % e
)
100 #print("".join(traceback.format_exception(*sys.exc_info())))
103 # _____ Define and setup target ___
107 # Just run entry_point if not RPython compilation
109 if not sys
.argv
[0].endswith('rpython'):
110 entry_point(sys
.argv
)