X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=week9.mdwn;h=568fc812dc66802eb89122197277c6f1a16e2995;hp=f5beebb4aa78e74e462a90bd9f5ce58869e37bdb;hb=677d5bbd54d54101e2855598db2aaae0d9ed6bad;hpb=54f07a87abd25524b0e1599cc5208c0c88b7a8c1 diff --git a/week9.mdwn b/week9.mdwn index f5beebb4..568fc812 100644 --- a/week9.mdwn +++ b/week9.mdwn @@ -304,6 +304,15 @@ For expressions we already know how to interpret, `s'` will usually just be `s`. eval expr2 ((c, value) :: g) s' ... +Similarly: + + ... + | Addition (expr1, expr2) -> + let (value1, s') = eval expr1 g s + in let (value2, s'') = eval expr2 g s' + in (value1 + value2, s'') + ... + Let's consider how to interpet our new syntactic forms `newref`, `deref`, and `setref`: @@ -332,7 +341,7 @@ Let's consider how to interpet our new syntactic forms `newref`, `deref`, and `s in (Index new_index, s'') ... -2. When `expr` evaluates to a `store_index`, then `deref expr` should evaluate to whatever value is at that index in the current store. (If `expr` evaluates to a value of another type, `deref expr` is undefined.) In this operation, we don't change the store at all; we're just reading from it. So we'll return the same store back unchanged. +2. When `expr` evaluates to a `store_index`, then `deref expr` should evaluate to whatever value is at that index in the current store. (If `expr` evaluates to a value of another type, `deref expr` is undefined.) In this operation, we don't change the store at all; we're just reading from it. So we'll return the same store back unchanged (assuming it wasn't changed during the evaluation of `expr`). let rec eval expression g s = match expression with @@ -350,7 +359,7 @@ Let's consider how to interpet our new syntactic forms `newref`, `deref`, and `s ... | Setref (expr1, expr2) -> let (Index n, s') = eval expr1 g s - (* note that s' may be different from s, if expr itself contained any mutation operations *) + (* note that s' may be different from s, if expr1 itself contained any mutation operations *) in let (new_value, s'') = eval expr2 g s' (* now we create a list which is just like s'' except it has new_value in index n *) in let rec replace_nth lst m =