aboutsummaryrefslogtreecommitdiff
path: root/python/step3_env.py
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-04-02 22:23:37 -0500
committerJoel Martin <github@martintribe.org>2014-04-02 22:23:37 -0500
commitea81a8087bcd7953b083a2be9db447f75e7ebf56 (patch)
tree6cf47a2dbd55d42efc4a901eaabdec952f40ce89 /python/step3_env.py
parent1617910ad342a55762f3ddabb975849d843cff85 (diff)
downloadmal-ea81a8087bcd7953b083a2be9db447f75e7ebf56.tar.gz
mal-ea81a8087bcd7953b083a2be9db447f75e7ebf56.zip
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.
Diffstat (limited to 'python/step3_env.py')
-rw-r--r--python/step3_env.py67
1 files changed, 33 insertions, 34 deletions
diff --git a/python/step3_env.py b/python/step3_env.py
index f95a978..21879d6 100644
--- a/python/step3_env.py
+++ b/python/step3_env.py
@@ -1,58 +1,57 @@
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
# 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)
- else:
- el = eval_ast(ast, env)
- f = el[0]
- return f(*el[1:])
+ 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)
+ else:
+ 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()
@@ -71,6 +70,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()))