Annotation of researchv10no/cmd/sml/doc/examples/lambda.sml, revision 1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.