1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| class Evaluator: def __init__(self): self._exp_parser = ExpressionParser() self._init_primitives() def eval(self,exp,env): if exp == []: return
if isinstance(exp,Expression) == False: exp = self._exp_parser.parse(exp)
if isinstance(exp,Expression) == False: if len(exp) == 1: exp = VariableExpression(exp) else: args = list(map(lambda arg: self.eval(arg,env),exp[1:])) proc = env.get_variable(exp[0]) if proc == None: proc = self._primitives[exp[0]] if isinstance(proc,ProcedureExpression): for i in range(len(proc.args)): proc.env.define_variable(proc.args[i],args[i]) return self.apply(proc,args) return exp.eval(self,env) def apply(self,proc,args): if proc in self._primitives.values(): return proc(*args) return self.eval(proc.proc,proc.env) def _init_primitives(self): self._primitives = { "+": add, "-": subtract, "*": multiply, "/": divide, "list": to_list, "cons": cons, "car": car, "cdr": cdr, "null?": null }
|