X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=code%2Funtyped_evaluator.ml;h=92efa6ea1d9522c0ad1605825995643fd3bbbc02;hp=e5ce1c12f81fb6ad1b1d93f085d15f4e71a78462;hb=5f451af940e44f03c8cab0864398d2e644566787;hpb=7212dc7d99d0852cc195677af5ec51966a6d9065 diff --git a/code/untyped_evaluator.ml b/code/untyped_evaluator.ml index e5ce1c12..92efa6ea 100644 --- a/code/untyped_evaluator.ml +++ b/code/untyped_evaluator.ml @@ -15,10 +15,6 @@ `reduce (App(Lambda("x",Var "x"),Lambda("y",Var "y")))` `evaluate (App(Lambda("x",Var "x"),Lambda("y",Var "y")))` - The environments play absolutely no role in the simplified V1 interpreter - presented here. In the fuller code, they have a limited role in the V1 - interpreter. In the V2 interpreter, the environments are essential. - The two interpreters presented below are (V1) a substitute-and-replace interpreter, and (V2) an environment-based interpreter. We discuss the differences between these in the notes. @@ -38,6 +34,10 @@ result values. But in the fuller code from which this is simplified, it makes more sense, because there we also have literal number and boolean values as results, too. + + The environments play absolutely no role in the simplified V1 interpreter + presented here. In the fuller code, they have a limited role in the V1 + interpreter. In the V2 interpreter, the environments are essential. *) type identifier = string @@ -56,16 +56,16 @@ and result = term (* This simplified code just provides a single implementation of environments; but the fuller code provides more. *) -and env = identifier -> term option +and env = (identifier * term) list (* Operations for environments *) -let empty = fun _ -> None -let shift (ident : identifier) binding env = - fun (sought_ident : identifier) -> - if ident = sought_ident - then Some binding - else env sought_ident -let lookup sought_ident env = env sought_ident +let empty = [] +let shift (ident : identifier) binding env = (ident,binding) :: env +let rec lookup (sought_ident : ident) (env : env) : term option = + match env with + | [] -> None + | (ident, binding) :: _ when ident = sought_ident -> Some binding + | _ :: env' -> lookup sought_ident env' (*