diff options
Diffstat (limited to 'python/step2_eval.py')
| -rw-r--r-- | python/step2_eval.py | 40 |
1 files changed, 19 insertions, 21 deletions
diff --git a/python/step2_eval.py b/python/step2_eval.py index 65972a2..e50d231 100644 --- a/python/step2_eval.py +++ b/python/step2_eval.py @@ -1,46 +1,44 @@ import sys, traceback import mal_readline -from mal_types import (pr_str, sequential_Q, symbol_Q, coll_Q, list_Q, - vector_Q, hash_map_Q, new_symbol, new_function, - new_list, new_vector, new_hash_map, Env, types_ns) -from reader import (read_str, Blank) +import mal_types as types +import reader, printer # read def READ(str): - return read_str(str) + return reader.read_str(str) # eval def eval_ast(ast, env): - if symbol_Q(ast): + if types._symbol_Q(ast): try: return env[ast] except: raise Exception("'" + ast + "' not found") - elif list_Q(ast): - return new_list(*map(lambda a: EVAL(a, env), ast)) - elif vector_Q(ast): - return new_vector(*map(lambda a: EVAL(a, env), ast)) - elif hash_map_Q(ast): + elif types._list_Q(ast): + return types._list(*map(lambda a: EVAL(a, env), ast)) + elif types._vector_Q(ast): + return types._vector(*map(lambda a: EVAL(a, env), ast)) + elif types._hash_map_Q(ast): keyvals = [] for k in ast.keys(): keyvals.append(EVAL(k, env)) keyvals.append(EVAL(ast[k], env)) - return new_hash_map(*keyvals) + return types._hash_map(*keyvals) else: return ast # primitive value, return unchanged def EVAL(ast, env): - #print("EVAL %s" % ast) - if not list_Q(ast): - return eval_ast(ast, env) + #print("EVAL %s" % ast) + if not types._list_Q(ast): + return eval_ast(ast, env) - # apply list - el = eval_ast(ast, env) - f = el[0] - return f(*el[1:]) + # apply list + el = eval_ast(ast, env) + f = el[0] + return f(*el[1:]) def PRINT(exp): - return pr_str(exp) + return printer._pr_str(exp) # repl repl_env = {} @@ -58,6 +56,6 @@ while True: if line == None: break if line == "": continue print(REP(line)) - except Blank: continue + except reader.Blank: continue except Exception as e: print "".join(traceback.format_exception(*sys.exc_info())) |
