def eval(x, env): "Evaluate an expression in an environment." if isa(x, Symbol): # variable reference return env[x] elif isa(x, list): # (proc exp*) proc = eval(x[0], env) if hasattr(proc, '__call__'): return proc(env,*x[1:]) raise ValueError("%s = %s is not a procedure" % (to_string(x[0]),to_string(proc))) return x
p = eval(p, v) return lambda v, *x: p(v, *[eval(expr, v) for expr in x]) basic_env = Env( { "+": lambda v, x, y: eval(x, v) + eval(y, v), "-": lambda v, x, y: eval(x, v) - eval(y, v), "*": lambda v, x, y: eval(x, v) * eval(y, v), "/": lambda v, x, y: eval(x, v) / eval(y, v), ">": lambda v, x, y: eval(x, v) > eval(y, v), "<": lambda v, x, y: eval(x, v) < eval(y, v), ">=": lambda v, x, y: eval(x, v) >= eval(y, v), "<=": lambda v, x, y: eval(x, v) <= eval(y, v), "=": lambda v, x, y: eval(x, v) == eval(y, v), "eq?": lambda v, x, y: (lambda vx, vy: (not isa(vx, list)) and (vx == vy))(eval(x, v), eval(y, v)), "cons": lambda v, x, y: [eval(x, v)] + eval(y, v), "car": lambda v, x: eval(x, v)[0], "cdr": lambda v, x: eval(x, v)[1:], "list": lambda v, *x: [eval(expr, v) for expr in x], "append": lambda v, x, y: eval(x, v) + eval(y, v), "len": lambda v, x: len(eval(x, v)), "symbol?": lambda v, x: isa(eval(x, v), Symbol), "list?": lambda v, x: isa(eval(x, v), list), "atom?": lambda v, x: not isa(eval(x, v), list), "exit": lambda v: exit(), "#t": True, "#f": False, "if": lambda v, z, t, f: eval((t if eval(z, v) else f), v), "cond": cond, ":=": defvar,
def wrap(v,p): p = eval(p,v) return lambda v,*x: p(v,*[eval(expr,v) for expr in x]) basic_env = Env({ '+': lambda v,x,y:eval(x,v)+eval(y,v), '-': lambda v,x,y:eval(x,v)-eval(y,v), '*': lambda v,x,y:eval(x,v)*eval(y,v), '/': lambda v,x,y:eval(x,v)/eval(y,v), '>': lambda v,x,y:eval(x,v)>eval(y,v), '<': lambda v,x,y:eval(x,v)<eval(y,v), '>=': lambda v,x,y:eval(x,v)>=eval(y,v), '<=': lambda v,x,y:eval(x,v)<=eval(y,v), '=': lambda v,x,y:eval(x,v)==eval(y,v), 'eq?': lambda v,x,y: (lambda vx,vy: (not isa(vx, list)) and (vx == vy))(eval(x,v),eval(y,v)), 'cons': lambda v,x,y:[eval(x,v)]+eval(y,v), 'car': lambda v,x:eval(x,v)[0], 'cdr': lambda v,x:eval(x,v)[1:], 'list': lambda v,*x:[eval(expr, v) for expr in x], 'append': lambda v,x,y:eval(x,v)+eval(y,v), 'len': lambda v,x:len(eval(x,v)), 'symbol?': lambda v,x:isa(eval(x,v),Symbol), 'list?': lambda v,x:isa(eval(x,v),list), 'atom?': lambda v,x:not isa(eval(x,v), list), 'exit': lambda v:exit(), '#t': True, '#f': False, 'if': lambda v,z,t,f: eval((t if eval(z,v) else f), v), 'cond': cond, ':=': define,
'*': lambda v, x, y: eval(x, v) * eval(y, v), '/': lambda v, x, y: eval(x, v) / eval(y, v), '>': lambda v, x, y: eval(x, v) > eval(y, v), '<': lambda v, x, y: eval(x, v) < eval(y, v), '>=': lambda v, x, y: eval(x, v) >= eval(y, v), '<=': lambda v, x, y: eval(x, v) <= eval(y, v), '=': lambda v, x, y: eval(x, v) == eval(y, v), 'eq?': lambda v, x, y: (lambda vx, vy: (not isa(vx, list)) and (vx == vy)) (eval(x, v), eval(y, v)), 'cons': lambda v, x, y: [eval(x, v)] + eval(y, v), 'car': lambda v, x: eval(x, v)[0], 'cdr': lambda v, x: eval(x, v)[1:], 'list': lambda v, *x: [eval(expr, v) for expr in x], 'append': lambda v, x, y: eval(x, v) + eval(y, v), 'len': lambda v, x: len(eval(x, v)), 'symbol?': lambda v, x: isa(eval(x, v), Symbol),