lecture 16 the environment model
DESCRIPTION
Lecture 16 The Environment Model. Substitution Model. Represents computation as doing substitutions for bound variables at reduction of let, application: let val x = v in e e { v / x } (fn( x : t )=> e )( v ) e { v / x } let val x = fn z:’a=>z in x(x(x)) - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/1.jpg)
CS 312Spring 2002
Lecture 16The Environment Model
![Page 2: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/2.jpg)
Substitution Model• Represents computation as doing
substitutions for bound variables at reduction of let, application:
let val x = v in e e{v/x}
(fn(x:t)=>e)(v) e{v/x}
let val x = fn z:’a=>z in x(x(x))end
(fn z=>z)((fn z=>z)(fn z=>z))
![Page 3: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/3.jpg)
Problems• Not a realistic implementation:
substitution is too slow
(fn(x:t)=>e)(v) e{v/x}… could be many x’s to substitute for…
• Doesn’t handle refs: no aliasingref 2 ?
let val a = ref 2 in(fn(x,y)=>…x:=1…!y…) (a,a)
end (fn(x,y)=>…x:=1…!y…)(ref 2,ref 2) ?
…(ref 2):=1…!(ref 2)… ?
![Page 4: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/4.jpg)
Environment Model
Don’t substitute for variables; look them up lazily in an environment!– No substitution, realistic cost model– The environment is a finite map from
variables to values– Example:let val x = 2 val y = “hello” val f = fn z:int=>xin f(x + size(y)) end
x: 2y: “hello”f: fn z:int=>x
Evaluate:
f(x + size(y))in environment:
?
![Page 5: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/5.jpg)
Variables• To evaluate a variable, look it up in the
environment. To look it up, we start with the last binding added to the environment and then work towards the nil.
• Evaluating “x” in this environment yields 3:
x : 3
y : 4
x : 2
z : 3env
nil
Blue boxes:bindings
![Page 6: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/6.jpg)
Let expressionsTo evaluate let val x = e1 in e2:
1. Evaluate e1 in the current environment
2. Extend the current environment with a binding that maps x to the value of e1
3. Evaluate e2 in the extended environment
4. Restore the old environment (i.e., remove the binding for x)
5. Return the value of e2
![Page 7: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/7.jpg)
Let Example
let val x = (1,2) in #1 x end
current env nil
![Page 8: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/8.jpg)
Let Examplelet val x = (1,2) in #1 x end
current env nil
1 2
1. Evaluating (1,2) yields a pointer to a tuple in memory.
![Page 9: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/9.jpg)
Let Example
let val x = (1,2) in #1 x end
current env nil
1 2
1. Evaluating (1,2) yields a pointer to a tuple in memory.
2. Extend the environment with a binding for x.
x: current env
![Page 10: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/10.jpg)
Let Example
let val x = (1,2) in #1 x end
nil
1 2
1. Evaluating (1,2) yields a pointer to a tuple in memory.
2. Extend the environment with a binding for x.
x: current env
3. Evaluate the body of the let in the new environment. x evaluates to a pointer to the tuple, so #1 x evaluates to the first component, namely 1.
![Page 11: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/11.jpg)
Let Example
let val x = (1,2) in #1 x end
nil
1 2
1. Evaluating (1,2) yields a pointer to a tuple in memory.
2. Extend the environment with a binding for x.
x: current env
3. Evaluate the body of the let in the new environment. x evaluates to a pointer to the tuple, so #1 x evaluates to the first component, namely 1.
4. Restore the old environment.current env
![Page 12: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/12.jpg)
Let Example
let val x = (1,2) in #1 x end
nil
1 2
1. Evaluating (1,2) yields a pointer to a tuple in memory.
2. Extend the environment with a binding for x.
x:
3. Evaluate the body of the let in the new environment. x evaluates to a pointer to the tuple, so #1 x evaluates to the first component, namely 1.
4. Restore the old environment.current env
5. Return the value we got: 1
![Page 13: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/13.jpg)
Pictorial Overview: • Primitive values like integers, reals,
unit, or nil evaluate to themselves.
• A tuple value, such as (1,2,3) evaluates to a pointer to a box in memory containing the values of the sub-expressions:
1 2 3
![Page 14: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/14.jpg)
Multiple DeclarationsTo evaluate:
let val x = e1 val y = e2 val z = e3 in e4 end
Do the same the same thing as you would for: let val x = e1 in let val y = e2 in let val z = e3 in e4 end end
end
![Page 15: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/15.jpg)
Examplelet val x = (3,4) val y = (x,x)in #1(#2 y)end
let val x = (3,4)in let val y = (x,x) in #1(#2 y) endend
nilcurrent env
![Page 16: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/16.jpg)
Evaluation of Examplelet val x = (3,4) val y = (x,x)in #1(#2 y)end
let val x = (3,4)in let val y = (x,x) in #1(#2 y) endend
nilcurrent env
3 4
![Page 17: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/17.jpg)
Evaluation of Example
let val x = (3,4) val y = (x,x)in #1(#2 y)end
let val x = (3,4)in let val y = (x,x) in #1(#2 y) endend
nil
current env 3 4x :
current env
![Page 18: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/18.jpg)
Evaluation of Example
let val x = (3,4) val y = (x,x)in #1(#2 y)end
let val x = (3,4)in let val y = (x,x) in #1(#2 y) endend
nil
3 4x : current env
![Page 19: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/19.jpg)
y :
Evaluation of Example
let val x = (3,4) val y = (x,x)in #1(#2 y)end
let val x = (3,4)in let val y = (x,x) in #1(#2 y) endend
nil
3 4x : current env
current env
![Page 20: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/20.jpg)
y :
Evaluation of Example
let val x = (3,4) val y = (x,x)in #1(#2 y)end
let val x = (3,4)in let val y = (x,x) in #1(#2 y) endend
nil
3 4x :
current env
![Page 21: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/21.jpg)
y :
Evaluation of Example
let val x = (3,4) val y = (x,x)in #1(#2 y)end
let val x = (3,4)in let val y = (x,x) in #1(#2 y) endend
nil
3 4x :
current env
Result : 3
![Page 22: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/22.jpg)
y :
Evaluation of Example
let val x = (3,4) val y = (x,x)in #1(#2 y)end
let val x = (3,4)in let val y = (x,x) in #1(#2 y) endend
nil
3 4x : current env
Result is 3
Restore last env
![Page 23: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/23.jpg)
y :
Evaluation of Example
let val x = (3,4) val y = (x,x)in #1(#2 y)end
let val x = (3,4)in let val y = (x,x) in #1(#2 y) endend
nil
3 4x :
current envResult is 3
Restore original env
![Page 24: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/24.jpg)
Refs• To evaluate ref e, evaluate e to a
value first, and then allocate a new ref cell, place the value in the ref cell, and return a pointer to the ref cell. For instance, ref (1,2,3)evaluates to:
1 2 3
ref cells = red boxes.
![Page 25: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/25.jpg)
Ref Examplelet val x = ref 2 in
val y = x
in
x:=1; !y
end
nilcurrent env
2
![Page 26: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/26.jpg)
Ref Examplelet val x = ref 2 in
val y = x
in
x:=1; !y
end
nil
2x : current env
![Page 27: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/27.jpg)
Ref Examplelet val x = ref 2 in
val y = x
in
x:=1; !y
end
nil
2x : current env
![Page 28: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/28.jpg)
y :
Ref Examplelet val x = ref 2 in
val y = x
in
x:=1; !y
end
nil
2x :
current env
![Page 29: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/29.jpg)
y :
Ref Examplelet val x = ref 2 in
val y = x
in
x:=1; !y
end
nil
1x :
current env
![Page 30: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/30.jpg)
y :
Ref Examplelet val x = ref 2 in
val y = x
in
x:=1; !y
end
nil
1x :
current env
Result: 1
![Page 31: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/31.jpg)
Functionslet val x = 2
val f = fn z:int => xinlet val x = “bye” in f(size(x)) end
• How do we make sure the environment has the (correct) binding for x?– We must keep track of the environment at the
point where the function was evaluated.– Function evaluation: fn z:int => x, not f(size(x))
• We create a closure– A pair of a function and its environment
Static scope:ML, Java, Scheme, …
Dynamic scope:Perl, Python, BASIC
![Page 32: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/32.jpg)
Functions• To evaluate a function(fn x => e)create a closure out of the function and the current environment and return a pointer to the closure.
y : 4
x : 2
nil
current env
![Page 33: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/33.jpg)
• To evaluate a function (fn x => e)create a closure out of the function and the current environment and return a pointer to the closure.
Creating closures
y : 4
x : 2
nilfn x => e
current env
ResultI’ll draw closures using yellow.
![Page 34: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/34.jpg)
Function Examplelet val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end
nilcurrent env
fn z:int => x
x : 2current env
![Page 35: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/35.jpg)
Function Examplelet val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end
nil
current env fn z:int => x
x : 2
f:
![Page 36: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/36.jpg)
Function Examplelet val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end
nil
current env
fn z:int => x
x : 2
f:
x : “bye”
![Page 37: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/37.jpg)
Function Examplelet val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end
nil
current env
fn z:int => x
x : 2
f:
x : “bye”
![Page 38: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/38.jpg)
Function CallsTo evaluate e1(e2):1. evaluate e1 -- you should get a pointer to a
closure.2. evaluate e2 to a value.3. save the current environment -- we’ll come
back to it after the function call.4. extend the environment of the closure, mapping
the formal argument to the actual argument.5. evaluate the body of the function within the
extended environment -- this gives us our result value.
6. restore the old environment (saved in step 3)7. return the result.
![Page 39: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/39.jpg)
Function Call Examplelet val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end
nil
current env
fn z:int => x
x : 2
f:
x : “bye”
1. Evaluate e1, e2
![Page 40: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/40.jpg)
Function Call Examplelet val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end
nil
saved env
fn z:int => x
x : 2
f:
x : “bye”
current env
1. Evaluate e1, e22. Save environ.
![Page 41: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/41.jpg)
Function Call Examplelet val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end
nil
saved env
fn z:int => x
x : 2
f:
x : “bye”
current env
1. Evaluate e1, e22. Save environ.3. Extend env with actual
z : 3
![Page 42: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/42.jpg)
Function Call Examplelet val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end
nil
saved env
fn z:int => x
x : 2
f:
x : “bye”
current env
1. Evaluate e1, e22. Save environ.3. Extend env with actual4. Evaluate body (result: 2)
z : 3
![Page 43: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/43.jpg)
Function Call Examplelet val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end
nil
current env
fn z:int => x
x : 2
f:
x : “bye”
1. Evaluate e1, e22. Save environ.3. Extend env with actual4. Evaluate body (result: 2)5. Restore env. (result: 2)
![Page 44: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/44.jpg)
let val x = ref (fn x:int => x) val f = fn n:int => if n <= 1 then 1 else n * (!x)(n-1)in x := f; f(3)end
Creating a cycle
current env nil
![Page 45: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/45.jpg)
let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1)in x := f; f(3)end
current env nil
fn x => x
Creating a cycle
![Page 46: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/46.jpg)
let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1)in x := f; f(3)end
current env nil
fn x => x
Creating a cycle
![Page 47: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/47.jpg)
let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1)in x := f; f(3)end
current env
nil
fn x => x
Creating a cycle
x :
![Page 48: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/48.jpg)
let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1)in x := f; f(3)end
current env
nil
fn x => x
Creating a cycle
x :
fn n => if n <= 1 then 1 else n * (!x)(n-1)
![Page 49: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/49.jpg)
let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1)in x := f; f(3)end
current env
nil
Creating a cycle
x :
fn n => if n <= 1 then 1 else n * (!x)(n-1) f :
fn x => x
![Page 50: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/50.jpg)
let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1)in x := f; f(3)end
current env
nil
Creating a cycle
x :
fn n => if n <= 1 then 1 else n * (!x)(n-1) f :
fn x => x
![Page 51: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/51.jpg)
let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1)in x := f; f(3)end
current env
nil
Creating a cycle
x :
fn n => if n <= 1 then 1 else n * (!x)(n-1) f :
![Page 52: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/52.jpg)
let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1)in x := f; f(3)end
saved env
nil
Creating a cycle
x :
fn n => if n <= 1 then 1 else n * (!x)(n-1) f :
n : 3
current env
Note: !x is the same as f
![Page 53: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/53.jpg)
let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1)in x := f; f(3)end
saved env 1
nil
Creating a cycle
x :
fn n => if n <= 1 then 1 else n * (!x)(n-1) f :
n : 3
saved env 2
n : 2
curr env
![Page 54: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/54.jpg)
let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1)in x := f; f(3)end
saved env 1
nil
Creating a cycle
x :
fn n => if n <= 1 then 1 else n * (!x)(n-1) f :
n : 3
saved env 2
n : 2
saved 3
n : 1
curr env Result = 1
![Page 55: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/55.jpg)
let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1)in x := f; f(3)end
saved env 1
nil
Creating a cycle
x :
fn n => if n <= 1 then 1 else n * (!x)(n-1) f :
n : 3
saved env 2
n : 2
curr env
n : 1
Result = 2*1
![Page 56: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/56.jpg)
let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1)in x := f; f(3)end
saved env 1
nil
Creating a cycle
x :
fn n => if n <= 1 then 1 else n * (!x)(n-1) f :
n : 3
curr env
n : 2
n : 1
Result = 3*2*1
![Page 57: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/57.jpg)
let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1)in x := f; f(3)end
curr env
nil
Creating a cycle
x :
fn n => if n <= 1 then 1 else n * (!x)(n-1) f :
n : 3
n : 2
n : 1
f(3) = 6
![Page 58: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/58.jpg)
Recursionlet fun f(n) = if n <= 1 then 1 else n * f(n-1)in f(3)end
1. create a new binding for f before creating the closure and extend the current environment with it (but don’t put in the value yet.)
2. now create a closure for f that uses the extended environment.
3. fix the binding to use the closure!
![Page 59: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/59.jpg)
Recursionlet fun f(n) => if n <= 1 then 1 else n * f(n-1)in f(3)end
current env
nil
f :
No value for f yet!
1. create a new binding for f before creating the closure and extend the current environment with it (but don’t put in the value yet.)
2. now create a closure for f that uses the extended environment.
3. fix the binding to use the closure!
![Page 60: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/60.jpg)
1. create a new binding for f before creating the closure and extend the current environment with it (but don’t put in the value yet.)
2. now create a closure for f that uses the extended environment.
3. fix the binding to use the closure!
Recursion
current env
nil
f :
fn n => if n <= 1 then 1 else n * f(n-1)
let fun f(n) => if n <= 1 then 1 else n * f(n-1)in f(3)end
![Page 61: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/61.jpg)
Recursion
current env
nil
f :
fn n => if n <= 1 then 1 else n * f(n-1)
1. create a new binding for f before creating the closure and extend the current environment with it (but don’t put in the value yet.)
2. now create a closure for f that uses the extended environment.
3. fix the binding to use the closure!
let fun f(n) => if n <= 1 then 1 else n * f(n-1)in f(3)end
![Page 62: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/62.jpg)
Cycle
current env
nil
f :
fn n => if n <= 1 then 1 else n * f(n-1)
let fun f(n) => if n <= 1 then 1 else n * f(n-1)in f(3)end• Closure points to environment• Environment points to closure
![Page 63: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/63.jpg)
Cycle
current env
nil
f :
fn n => if n <= 1 then 1 else n * f(n-1)
let fun f(n) => if n <= 1 then 1 else n * f(n-1)in f(3)end
n : 3
![Page 64: Lecture 16 The Environment Model](https://reader035.vdocuments.net/reader035/viewer/2022070404/56813b13550346895da3c162/html5/thumbnails/64.jpg)
Comparison
current env
nil
f :
fn n => if n <= 1 then 1 else n * f(n-1)
x :
current env
nil
fn n => if n <= 1 then 1 else n * (!x)(n-1) f :