exercises
[lambda.git] / exercises / _assignment6.mdwn
index f6a4803..9431edf 100644 (file)
@@ -40,17 +40,45 @@ We're not going to ask you to write the entire program yourself.
 Instead, we're going to give you [[the complete program, minus a few
 little bits of glue|code/reduction.ml]].  What you need to do is
 understand how it all fits together.  When you do, you'll understand
-how to add the last little bits to make functioning program.  Here's a
-first target for when you get it working:
-
-    # reduce (App (Abstract ("x", Var "x"), Constant (Num 3)));;
-    - : lambdaTerm = Constant (Num 3)
+how to add the last little bits to make functioning program.  
 
 1. In the previous homework, you built a function that took an
 identifier and a lambda term and returned a boolean representing
 whether that identifier occured free inside of the term.  Your first
-task is to adapt your previous solution as necessary to work with the
-code base.  Once you have your function working, you should be able to
-run queries such as this:
+task is to complete the `free_in` function, which has been crippled in
+the code base (look for lines that say `COMPLETE THIS LINE`).  Once
+you have your function working, you should be able to run queries such
+as this:
+
+    # free_in "x" (App (Abstract ("x", Var "x"), Var "x"));;
+    - : bool = true
+
+2. Once you get the `free_in` function working, you'll need to
+complete the `substitute` function.  You'll see a new wrinkle on
+OCaml's pattern-matching construction: `| PATTERN when x = 2 ->
+RESULT`.  This means that a match with PATTERN is only triggered if
+the boolean condition in the `when` clause evaluates to true.
+Sample target:
+
+    # substitute (App (Abstract ("x", ((App (Abstract ("x", Var "x"), Var "y")))), Constant (Num 3))) "y" (Constant (Num 4));;
+    - : lambdaTerm = App (Abstract ("x", App (Abstract ("x", Var "x"), Constant (Num 4))), Constant (Num 3))
+
+3. Once you have completed the previous two problems, you'll have a
+complete evaluation program. Here's a simple sanity check for when you
+get it working:
+
+    # reduce (App (Abstract ("x", Var "x"), Constant (Num 3)));;
+    - : lambdaTerm = Constant (Num 3)
+
+What kind of evaluation strategy does this evaluator use?  In
+particular, what are the answers to the three questions about
+evaluation strategy as given in the discussion of [[evaluation
+strategies|topics/week3_evaluation_order]] as Q1, Q2, and Q3?
+
+## Evaluation in the untyped calculus: environments
+
+Ok, the previous strategy sucked: tracking free and bound variables,
+computing fresh variables, it's all super complicated.
+Here's a better strategy.