From ea81a8087bcd7953b083a2be9db447f75e7ebf56 Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Wed, 2 Apr 2014 22:23:37 -0500 Subject: All: split types into types, env, printer, core. - types: low-level mapping to the implementation language. - core: functions on types that are exposed directly to mal. - printer: implementation called by pr-str, str, prn, println. - env: the environment implementation - Also, unindent all TCO while loops so that the diff of step4 and step5 are minimized. --- python/step4_if_fn_do.py | 96 ++++++++++++++++++++++++------------------------ 1 file changed, 48 insertions(+), 48 deletions(-) (limited to 'python/step4_if_fn_do.py') diff --git a/python/step4_if_fn_do.py b/python/step4_if_fn_do.py index 4b54d8f..d0a7fc3 100644 --- a/python/step4_if_fn_do.py +++ b/python/step4_if_fn_do.py @@ -1,72 +1,72 @@ 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 +from env import Env +import core # 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): return env.get(ast) - 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 - if len(ast) == 0: return ast - a0 = ast[0] + # apply list + if len(ast) == 0: return ast + a0 = ast[0] - if "def!" == a0: - a1, a2 = ast[1], ast[2] - res = EVAL(a2, env) - return env.set(a1, res) - elif "let*" == a0: - a1, a2 = ast[1], ast[2] - let_env = Env(env) - for i in range(0, len(a1), 2): - let_env.set(a1[i], EVAL(a1[i+1], let_env)) - return EVAL(a2, let_env) - elif "do" == a0: - el = eval_ast(ast[1:], env) - return el[-1] - elif "if" == a0: - a1, a2 = ast[1], ast[2] - cond = EVAL(a1, env) - if cond is None or cond is False: - if len(ast) > 3: return EVAL(ast[3], env) - else: return None + if "def!" == a0: + a1, a2 = ast[1], ast[2] + res = EVAL(a2, env) + return env.set(a1, res) + elif "let*" == a0: + a1, a2 = ast[1], ast[2] + let_env = Env(env) + for i in range(0, len(a1), 2): + let_env.set(a1[i], EVAL(a1[i+1], let_env)) + return EVAL(a2, let_env) + elif "do" == a0: + el = eval_ast(ast[1:], env) + return el[-1] + elif "if" == a0: + a1, a2 = ast[1], ast[2] + cond = EVAL(a1, env) + if cond is None or cond is False: + if len(ast) > 3: return EVAL(ast[3], env) + else: return None + else: + return EVAL(a2, env) + elif "fn*" == a0: + a1, a2 = ast[1], ast[2] + return types._function(EVAL, Env, a2, env, a1) else: - return EVAL(a2, env) - elif "fn*" == a0: - a1, a2 = ast[1], ast[2] - return new_function(EVAL, a2, env, a1) - else: - el = eval_ast(ast, env) - f = el[0] - return f(*el[1:]) + el = eval_ast(ast, env) + f = el[0] + return f(*el[1:]) # print def PRINT(exp): - return pr_str(exp) + return printer._pr_str(exp) # repl repl_env = Env() @@ -75,7 +75,7 @@ def REP(str): def _ref(k,v): repl_env.set(k, v) # Import types functions -for name, val in types_ns.items(): _ref(name, val) +for name, val in core.ns.items(): _ref(name, val) # Defined using the language itself REP("(def! not (fn* (a) (if a false true)))") @@ -86,6 +86,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())) -- cgit v1.2.3