lis.py: added 'define' procedure short form
This commit is contained in:
@@ -142,22 +142,22 @@ def lispstr(exp: object) -> str:
|
|||||||
def evaluate(x: Expression, env: Environment) -> Any:
|
def evaluate(x: Expression, env: Environment) -> Any:
|
||||||
"Evaluate an expression in an environment."
|
"Evaluate an expression in an environment."
|
||||||
match x:
|
match x:
|
||||||
case Symbol(var): # variable reference
|
case Symbol(var): # variable reference
|
||||||
return env[var]
|
return env[var]
|
||||||
case literal if not isinstance(x, list): # constant literal
|
case literal if not isinstance(x, list): # constant literal
|
||||||
return literal
|
return literal
|
||||||
case ['quote', exp]: # (quote exp)
|
case ['quote', exp]: # (quote exp)
|
||||||
return exp
|
return exp
|
||||||
case ['if', test, conseq, alt]: # (if test conseq alt)
|
case ['if', test, conseq, alt]: # (if test conseq alt)
|
||||||
exp = conseq if evaluate(test, env) else alt
|
exp = conseq if evaluate(test, env) else alt
|
||||||
return evaluate(exp, env)
|
return evaluate(exp, env)
|
||||||
case ['define', Symbol(var), exp]: # (define var exp)
|
case ['lambda', parms, body]: # (lambda (parm...) body)
|
||||||
env[var] = evaluate(exp, env)
|
|
||||||
case ['define', [name, *parms], body]: # (define (fun parm...) body)
|
|
||||||
env[name] = Procedure(parms, body, env)
|
|
||||||
case ['lambda', parms, body]: # (lambda (parm...) body)
|
|
||||||
return Procedure(parms, body, env)
|
return Procedure(parms, body, env)
|
||||||
case [op, *args]: # (proc arg...)
|
case ['define', Symbol(var), exp]: # (define var exp)
|
||||||
|
env[var] = evaluate(exp, env)
|
||||||
|
case ['define', [name, *parms], body]: # (define (fun parm...) body)
|
||||||
|
env[name] = Procedure(parms, body, env)
|
||||||
|
case [op, *args]: # (proc arg...)
|
||||||
proc = evaluate(op, env)
|
proc = evaluate(op, env)
|
||||||
values = (evaluate(arg, env) for arg in args)
|
values = (evaluate(arg, env) for arg in args)
|
||||||
return proc(*values)
|
return proc(*values)
|
||||||
|
|||||||
Reference in New Issue
Block a user