예제 #1
0
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
예제 #2
0
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
예제 #3
0
    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,
예제 #4
0
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,
예제 #5
0
 '*':
 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),