exx
[lambda.git] / exercises / _assignment6.mdwn
index 1065725..e68d3f1 100644 (file)
@@ -70,7 +70,7 @@ 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
+4. 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?
@@ -79,6 +79,34 @@ strategies|topics/week3_evaluation_order]] as Q1, Q2, and Q3?
 
 Ok, the previous strategy sucked: tracking free and bound variables,
 computing fresh variables, it's all super complicated.
-Here's a better strategy.
 
+Here's a better strategy. Instead of keeping all of the information
+about which variables have been bound or are still free implicitly
+inside of the terms, we'll keep score.  This will require us to carry
+around a scorecard, which we will call an "environment".  This is a
+familiar strategy, since it amounts to evaluating expressions relative
+to an assignment function.  The difference between the assignment
+function approach above, and this approach, is one huge step towards
+monads.
+
+5. First, you need to get [[the evaluation
+code|code/reduction_with_environments.ml]]  working.  Look in the
+code for places where you see "not yet implemented", and get enough of
+those places working that you can use the code to evaluate terms.
+
+6. A snag: what happens when we want to replace a variable with a term
+that itself contains a free variable?  
+
+    term          environment
+    ------------- -------------
+    (\w.(\y.y)w)2 []
+    (\y.y)w       [w->2]
+    y             [w->2, y->w]
+
+In the first step, we bind `w` to the argument `2`.  In the second
+step, we bind `y` to the argument `w`.  In the third step, we would
+like to replace `y` with whatever its current value is according to
+our scorecard.  On the simple-minded view, we would replace it with
+`w`.  But that's not the right result, because `w` itself has been
+mapped onto 2.