|
|
1.1 ! root 1: (* ----- An Interpreter for Call-by-Value lambda-calculus ----- *) ! 2: ! 3: datatype ide = IDE of string ! 4: ! 5: datatype term = VAR of ide | LAMB of ide * term | APPL of term * term ! 6: ! 7: datatype env = ENV of ide -> value ! 8: and value = CLOSURE of term * env ! 9: ! 10: exception Unbound_var of string ! 11: ! 12: val Arid = ENV(fn (IDE s) => raise Unbound_var s) ! 13: ! 14: fun LookUp(ide, ENV f) = f ide ! 15: ! 16: fun Extend(ide, value, env) = ! 17: ENV(fn ide' => if ide'=ide then value else LookUp(ide',env)) ! 18: ! 19: fun Eval(VAR ide, env) = LookUp(ide,env) | ! 20: Eval(lamb as LAMB _, env) = CLOSURE(lamb,env) | ! 21: Eval(APPL(rator,rand), env) = Apply(Eval(rator,env),Eval(rand,env)) ! 22: ! 23: and Apply(CLOSURE(LAMB(bind,body),env),arg) = ! 24: Eval(body,Extend(bind,arg,env)) ! 25: ! 26: fun i s = IDE s (* abbreviation for identifiers *) ! 27: and v s = VAR(IDE s) (* abbreviation for variables *) ! 28: ! 29: infix * ! 30: fun f * g = APPL(f,g) (* abbreviation for application *) ! 31: ! 32: val I = LAMB(i"a",v"a") (* I a = a *) ! 33: val K = LAMB(i"a",LAMB(i"b",v"a")) (* K a b = a *) ! 34: val S = LAMB(i"a",LAMB(i"b",LAMB(i"c", (* S a b c = (a c) (b c) *) ! 35: (v"a" * v"c") * (v"b" * v"c")))) ! 36: val D = LAMB(i"a", v"a" * v"a") (* D a = a a *) ! 37: ! 38: ! 39: ! 40:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.