(*
- This is a simplified version of the code at ...
+ This is a simplified version of the code at http://lambda.jimpryor.net/code/untyped_full-1.7.tgz
You can use this code as follows:
1. First, use a text editor to fill in the (* COMPLETE THIS *) portions.
`reduce (App(Lambda("x",Var "x"),Lambda("y",Var "y")))`
`evaluate (App(Lambda("x",Var "x"),Lambda("y",Var "y")))`
- The two interpreters presented below are (VersionA) a substitute-and-replace
+ The two interpreters presented below are (VersionA) a substitute-and-repeat
interpreter, and (VersionB) an environment-based interpreter. We discuss the
differences between these in the course notes.
(* Operations for environments *)
let empty = []
let shift (ident : identifier) binding env = (ident,binding) :: env
-let rec lookup (sought_ident : ident) (env : env) : term option =
+let rec lookup (sought_ident : identifier) (env : env) : term option =
match env with
| [] -> None
| (ident, binding) :: _ when ident = sought_ident -> Some binding
eval raises this exception when it fails to reduce/evaluate
a term, because it has components for which no
reduction/evaluation is defined, such as `x y`. The
- reduction-based interpreter just signals this with a normal
+ substitute-and-repeat interpreter just signals this with a normal
return value; but the environment-based interpreter uses an
exception to abort prematurely.