def repl(): # set up base environment env = Env(outer=None) for k, v in ns.items(): env.set(k, v) env.set(SYMBOL_EVAL, lambda ast: EVAL(ast, env=env)) # `eval` added to ns s = """ (def! load-file (fn* (f) (eval (read-string (str "(do " (slurp f) ")"))))) """ EVAL(READ(s), env=env) # read-eval-print loop while True: try: s = input("=> ") rep(s, env) except Exception as e: print("error: {0}".format(e))
def PRINT(print_in): return printer.pr_str(print_in) def rep(rep_in): read_out = READ(rep_in) eval_out = EVAL(read_out, repl_env) print_out = PRINT(eval_out) return print_out repl_env = Env() # Add namespace variables to repl environment for key, value in ns.items(): repl_env.set(key, value) # Add the eval operator repl_env.set('eval', lambda ast: EVAL(ast, repl_env)) rep("(def! not (fn* (a) (if a false true)))") rep('(def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \")\")))))' ) while True: try: usr_input = input("user> ") rep_result = rep(usr_input) if rep_result is not None: print(rep_result)
import reader import printer import mal_types from env import Env from core import ns repl_env = Env() repl_env.set('eval', lambda ast: EVAL(ast, repl_env)) for k, v in ns.items(): repl_env.set(k, v) def READ(string): return reader.read_str(string) def EVAL(ast, env): while True: if not isinstance(ast, mal_types.list_types): return eval_ast(ast, env) elif not ast: return ast elif isinstance(ast, mal_types.list_types): if len(ast) == 0: return ast if isinstance(ast[0], mal_types.MalSymbol): if ast[0].data == 'def!': value = EVAL(ast[2], env) env.set(ast[1].data, value) return value
#!/usr/bin/env python3 import readline import sys import reader, printer from types import * from env import Env from core import ns repl_env = Env(None) repl_env.set('eval', lambda ast: EVAL(ast, repl_env)) for name, f in ns.items(): repl_env.set(name, f) def READ(s): return reader.read_str(s) def EVAL(ast, env): while True: # allow tail call optimization (TCO) if isinstance(ast, MalList): if len(ast) == 0: return ast call = ast[0] if call == 'def!': f_name, f_def, *others = ast[1:] if others: