- [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
-
+ [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 ...