week9 tweak
[lambda.git] / week9.mdwn
index 4388288..1904158 100644 (file)
@@ -500,62 +500,73 @@ To get the whole process started, the complex computation so defined will need t
 
 -- FIXME --
 
-    [H] ; *** aliasing ***
-        let y be 2 in
-          let x be y in
-            let w alias y in
-              (y, x, w)           ==> (2, 2, 2)
-
-    [I] ; mutation plus aliasing
-        let y be 2 in
-          let x be y in
-            let w alias y in
-              change y to 3 then
-                (y, x, w)         ==> (3, 2, 3)
-
-    [J] let f be (lambda (y) -> BODY) in  ; a
-          ... f (EXPRESSION) ...
-
-        (lambda (y) -> BODY) EXPRESSION
-
-        let y be EXPRESSION in            ; b
-          ... BODY ...
-
-    [K] ; *** passing "by reference" ***
-        let f be (lambda (alias w) ->     ; ?
-          BODY
-        ) in
-          ... f (y) ...
-
-        let w alias y in                  ; d
-          ... BODY ...
-
-    [L] let f be (lambda (alias w) ->
-          change w to 2 then
-            w + 2
-        ) in
-          let y be 1 in
-            let z be f (y) in
-              ; y is now 2, not 1
-              (z, y)              ==> (4, 2)
-
-    [M] ; hyper-evaluativity
-        let h be 1 in
-          let p be 1 in
-            let f be (lambda (alias x, alias y) ->
-              ; contrast here: "let z be x + y + 1"
-              change y to y + 1 then
-                let z be x + y in
-                  change y to y - 1 then
-                    z
-            ) in
-              (f (h, p), f (h, h))
-                                  ==> (3, 4)
-
-    Notice: h, p have same value (1), but f (h, p) and f (h, h) differ
-
-
-Fine and Pryor on "coordinated contents" (see, e.g., [Hyper-Evaluativity](http://www.jimpryor.net/research/papers/Hyper-Evaluativity.txt))
+       [H] ; *** aliasing ***
+           let y be 2 in
+             let x be y in
+               let w alias y in
+                 (y, x, w)
+                                                               ; evaluates to (2, 2, 2)
+
+       [I] ; mutation plus aliasing
+           let y be 2 in
+             let x be y in
+               let w alias y in
+                 change y to 3 then
+                   (y, x, w)
+                                                               ; evaluates to (3, 2, 3)
+
+       [J] ; as we already know, these are all equivalent:
+       
+           let f be (lambda (y) -> BODY) in  ; #1
+             ... f (EXPRESSION) ...
+       
+           (lambda (y) -> BODY) EXPRESSION   ; #2
+       
+           let y be EXPRESSION in            ; #3
+             ... BODY ...
+
+       [K] ; *** passing by reference ***
+           ; now think: "[J#1] is to [J#3] as [K#1] is to [K#2]"
+       
+           ?                                 ; #1
+       
+           let w alias y in                  ; #2
+             ... BODY ...
+       
+           ; We introduce a special syntactic form to supply
+           ; the missing ?
+       
+           let f be (lambda (alias w) ->     ; #1
+             BODY
+           ) in
+             ... f (y) ...
+
+       [L] let f be (lambda (alias w) ->
+             change w to 2 then
+               w + 2
+           ) in
+             let y be 1 in
+               let z be f (y) in
+                 ; y is now 2, not 1
+                 (z, y)
+                                                               ; evaluates to (4, 2)
+
+       [M] ; hyper-evaluativity
+           let h be 1 in
+             let p be 1 in
+               let f be (lambda (alias x, alias y) ->
+                 ; contrast here: "let z be x + y + 1"
+                 change y to y + 1 then
+                   let z be x + y in
+                     change y to y - 1 then
+                       z
+               ) in
+                 (f (h, p), f (h, h))
+                                                               ; evaluates to (3, 4)
+
+Notice: in [M], `h` and `p` have same value (1), but `f (h, p)` and `f (h, h)` differ.
+
+See Pryor's "[Hyper-Evaluativity](http://www.jimpryor.net/research/papers/Hyper-Evaluativity.txt)".
 
 
 ##Four grades of mutation involvement##
@@ -660,17 +671,18 @@ Programming languages tend to provide a bunch of mutation-related capabilities a
 
        Of course, in most languages you wouldn't be able to evaluate a comparison like `getter = getter'`, because in general the question whether two computations always return the same values for the same argument is not decidable. So typically languages don't even try to answer that question. However, it would still be true that `getter` and `getter'` (and `adder` and `adder'`) were extensionally equivalent.
 
-       However, they're not numerically identical, because by calling `setter 2` (but not calling `setter' 2`) we can mutate the function value `getter` (and `adder`) so that it's *no longer* numerically equivalent to `getter'` (or `adder'`).
+       However, they're not numerically identical, because by calling `setter 2` (but not calling `setter' 2`) we can mutate the function value `getter` (and `adder`) so that it's *no longer* qualitatively indiscernible from `getter'` (or `adder'`).
 
 
  
-*      A fourth grade of mutation involvement...
+*      A fourth grade of mutation involvement: (--- FIXME ---)
 
        structured references
         (a) if `a` and `b` are mutable variables that uncoordinatedly refer to numerically the same value
             then mutating `b` won't affect `a` or its value
         (b) if however their value has a mutable field `f`, then mutating `b.f` does
             affect their shared value; will see a difference in what `a.f` now evaluates to
+               (c) examples: Scheme mutable pairs, OCaml mutable arrays or records