X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=code%2Fcalculator%2Fcalc4.ml;h=54519f0c6121f0630d1da925374e49dfcb526960;hp=378e037f9a8437311c3b6dd7a41c631e4743a14d;hb=060198e29e2a13552ee64c1e489eea555c8b1cae;hpb=00ea8839bac58c3c1d53460dd34efc4722c8a6f2 diff --git a/code/calculator/calc4.ml b/code/calculator/calc4.ml index 378e037f..54519f0c 100644 --- a/code/calculator/calc4.ml +++ b/code/calculator/calc4.ml @@ -38,7 +38,7 @@ let (Int i1, s') = eval t1 g s in let (Int i2, s'') = eval t2 g s' in (Int (i1 + i2), s'') - | Variable (var) -> ( + | Variable (var) -> (( (* we don't handle cases where g doesn't bind var to any value *) match List.assoc var g with | Nonrecursive value -> value @@ -46,7 +46,7 @@ (* we update savedg to bind self_var to rec_closure here *) let savedg' = (self_var, rec_closure) :: savedg in Closure (arg_var, body, savedg') - ), s + ), s) | Let (var_to_bind, t2, t3) -> (* evaluate t3 under a new assignment where var_to_bind has been bound to the result of evaluating t2 under the current assignment *) @@ -88,12 +88,12 @@ in let g' = (var_to_bind, Recursive_Closure (var_to_bind, arg_var, body, savedg)) :: g in eval t3 g' s' | Newref (t1) -> - let (starting_val, s') = eval t1 g s + let (value1, s') = eval t1 g s (* note that s' may be different from s, if t1 itself contained any mutation operations *) (* now we want to retrieve the next free index in s' *) in let new_index = List.length s' - (* now we want to insert starting_val there; the following is an easy but inefficient way to do it *) - in let s'' = List.append s' [starting_val] + (* now we want to insert value1 there; the following is an easy but inefficient way to do it *) + in let s'' = List.append s' [value1] (* now we return a pair of a wrapped new_index, and the new store *) in (Mutcell new_index, s'') | Deref (t1) -> @@ -105,12 +105,12 @@ (* we don't handle cases where t1 doesn't evaluate to a Mutcell *) let (Mutcell index1, s') = eval t1 g s (* note that s' may be different from s, if t1 itself contained any mutation operations *) - in let (new_value, s'') = eval t2 g s' - (* now we create a list which is just like s'' except it has new_value in index1 *) + in let (value2, s'') = eval t2 g s' + (* now we create a list which is just like s'' except it has value2 in index1 *) in let rec replace_nth lst m = match lst with | [] -> failwith "list too short" - | x::xs when m = 0 -> new_value :: xs + | x::xs when m = 0 -> value2 :: xs | x::xs -> x :: replace_nth xs (m - 1) in let s''' = replace_nth s'' index1 (* we'll arbitrarily return Int 42 as the expressed_value of a Setref operation *)