2014-03-24 16:32:24 -05:00
|
|
|
import sys, traceback
|
|
|
|
|
import mal_readline
|
2014-04-02 22:23:37 -05:00
|
|
|
import mal_types as types
|
|
|
|
|
import reader, printer
|
2014-03-24 16:32:24 -05:00
|
|
|
|
|
|
|
|
# read
|
2024-08-08 16:08:30 +02:00
|
|
|
READ = reader.read_str
|
2014-03-24 16:32:24 -05:00
|
|
|
|
|
|
|
|
# eval
|
2022-01-10 00:15:40 +01:00
|
|
|
def EVAL(ast, env):
|
|
|
|
|
# print('EVAL: ' + printer._pr_str(ast))
|
|
|
|
|
|
2014-04-02 22:23:37 -05:00
|
|
|
if types._symbol_Q(ast):
|
2014-03-29 17:35:53 -05:00
|
|
|
try:
|
|
|
|
|
return env[ast]
|
|
|
|
|
except:
|
|
|
|
|
raise Exception("'" + ast + "' not found")
|
2014-04-02 22:23:37 -05:00
|
|
|
elif types._vector_Q(ast):
|
2024-08-08 16:08:30 +02:00
|
|
|
return types.Vector(EVAL(a, env) for a in ast)
|
2014-04-02 22:23:37 -05:00
|
|
|
elif types._hash_map_Q(ast):
|
2021-08-21 19:08:17 +02:00
|
|
|
return types.Hash_Map((k, EVAL(v, env)) for k, v in ast.items())
|
2022-01-10 00:15:40 +01:00
|
|
|
elif not types._list_Q(ast):
|
2014-03-24 16:32:24 -05:00
|
|
|
return ast # primitive value, return unchanged
|
2022-01-10 00:15:40 +01:00
|
|
|
else:
|
2014-03-24 16:32:24 -05:00
|
|
|
|
2014-04-02 22:23:37 -05:00
|
|
|
# apply list
|
2016-04-02 17:56:04 -05:00
|
|
|
if len(ast) == 0: return ast
|
2022-01-10 00:15:40 +01:00
|
|
|
f = EVAL(ast[0], env)
|
|
|
|
|
args = ast[1:]
|
|
|
|
|
return f(*(EVAL(a, env) for a in args))
|
2014-03-24 16:32:24 -05:00
|
|
|
|
2015-07-30 21:15:55 -05:00
|
|
|
# print
|
2024-08-08 16:08:30 +02:00
|
|
|
PRINT = printer._pr_str
|
2014-03-24 16:32:24 -05:00
|
|
|
|
|
|
|
|
# repl
|
2022-01-10 00:15:40 +01:00
|
|
|
repl_env = {}
|
2014-03-24 16:32:24 -05:00
|
|
|
def REP(str):
|
|
|
|
|
return PRINT(EVAL(READ(str), repl_env))
|
|
|
|
|
|
|
|
|
|
repl_env['+'] = lambda a,b: a+b
|
|
|
|
|
repl_env['-'] = lambda a,b: a-b
|
|
|
|
|
repl_env['*'] = lambda a,b: a*b
|
2024-08-08 16:08:30 +02:00
|
|
|
repl_env['/'] = lambda a,b: a//b
|
2014-03-24 16:32:24 -05:00
|
|
|
|
2014-04-19 13:04:09 -05:00
|
|
|
# repl loop
|
2014-03-24 16:32:24 -05:00
|
|
|
while True:
|
|
|
|
|
try:
|
|
|
|
|
line = mal_readline.readline("user> ")
|
|
|
|
|
print(REP(line))
|
2024-08-08 16:08:30 +02:00
|
|
|
except EOFError:
|
|
|
|
|
print()
|
|
|
|
|
break
|
2014-04-02 22:23:37 -05:00
|
|
|
except reader.Blank: continue
|
2024-08-08 16:08:30 +02:00
|
|
|
except Exception:
|
2014-04-16 22:42:17 -05:00
|
|
|
print("".join(traceback.format_exception(*sys.exc_info())))
|