Transcript slides

Lecture 19:
Environments
CS200: Computer Science
University of Virginia
Computer Science
David Evans
http://www.cs.virginia.edu/~evans
Menu
• Exam 1
• Environments
• Evaluation Rules
27 February 2002
CS 200 Spring 2002
2
How does Exam 1 compare to
other CS classes?
27 February 2002
CS 200 Spring 2002
3
CS 101 (Spring 2001)
7. Why do programmers comment?
(a) Give compiler extra instructions
(b) Aid readability
(c) To hide code for debugging purposes
(d) (b) and (c)
“Correct” answer
(e) none of the above
27 February 2002
CS 200 Spring 2002
4
Why Comment?
• To assign credit, blame or (non) liability (your
name, copyright, disclaimer)
• To document external assumptions
• To remind you what you are doing (e.g., ;;; This
is a bug!)
• To keep code readers entertained with jokes,
poems, and stories
• To make sure your employer has to rehire you to
fix the code (comments in foreign languages are
especially effective)
27 February 2002
CS 200 Spring 2002
5
CS 201 (Fall 2001)
5. [13 points total] Recursion.
The “SuperCool” function is defined for positive integers greater
than or equal to zero as:
supercool(i) = supercool(i-1) *
supercool(i-2);
supercool(0) = 1;
supercool(1) = 2;
For example:
supercool(2) = 2 * 1 = 2
supercool(3) = 2 * 2 = 4
supercool(4) = 4 * 2 = 8
supercool(5) = 8 * 4 = 32
Write a recursive function that calculates supercool. Your
function must be recursive to receive any credit.
27 February 2002
CS 200 Spring 2002
6
CS 415 (Spring 2002)
3. Define a function (zip op x y) that takes lists (x1
x2 x3 ....) and (y1 y2 y3 ...) and evaluated to the
list ((op x1 y1) (op x2 y2) (op x3 y3) ...).
Examples:
> (zip + '(1 2 3 4) '(5 10 15 20))
(6 12 18 24)
> (zip list '(a b c d) '(6 7 8 9))
((a 6) (b 7) (c 8) (d 9))
27 February 2002
CS 200 Spring 2002
7
zip
(define (zip f list1 list2)
(if (null? list1) null
(cons (f (car list1) (car list2))
(zip f (cdr list1) (cdr list2)))))
(define zip map)
27 February 2002
CS 200 Spring 2002
(Easy way)
8
CS 655 (Spring 2001)
1. Mergering
a. Write a Scheme procedure listadder that
combines two lists by adding their elements. For
example, (listadder '(3 1 3) '(3 4 2)) should
produce (6 5 5).
b. Write deeplistadder that works on nested lists
also. For example,
(deeplistadder '((1 2 (3 4)) 4) '((1 2 (3 4)) 6))
should produce ((2 4 (6 8)) 10).
27 February 2002
CS 200 Spring 2002
9
listadder
(define (listadder list1 list2)
(if (null? list1) '()
(cons (+ (car list1) (car list2))
(listadder (cdr list1)
(cdr list2)))))
27 February 2002
CS 200 Spring 2002
10
deeplistadder
(define (deeplistadder list1 list2)
(if (null? list1) list1
(if (list? (car list1))
(cons (deeplistadder (car list1)
(car list2))
(deeplistadder (cdr list1)
(cdr list2)))
(cons (+ (car list1) (car list2))
(deeplistadder
(cdr list1) (cdr list2))))))
27 February 2002
CS 200 Spring 2002
11
deeplistmerger
(define (deeplistmerger f list1 list2)
(if (null? list1) list1
(if (list? (car list1))
(cons (deeplistmapper f (car list1)
(car list2))
(deeplistmapper f (cdr list1)
(cdr list2)))
(cons (f (car list1) (car list2))
(deeplistmapper f
(cdr list1) (cdr list2))))))
27 February 2002
CS 200 Spring 2002
12
PhD Qualifying Exam
Using any language you
want, write a program
that reverses a list?
27 February 2002
CS 200 Spring 2002
13
reverse
• A recursive definition:
– Reversing an empty list is an empty list
– To reverse a non-empty list, put the first
element of the list at the end of the result of
reversing the rest of the list
(a . rest)
1234
27 February 2002
 (reverse rest) . a
 (reverse 2 3 4) 1
 (reverse 3 4) 2 1
 (reverse 4) 3 2 1
 (reverse ) 4 3 2 1
4321
CS 200 Spring 2002
14
reverse try 1:
(define (reverse lst)
(if (null? lst) lst
(cons (reverse (cdr lst)) (car lst))))
(reverse ‘(1 2))
((lambda (lst) (if (null? lst) lst
(cons (reverse (cdr lst)) (car lst)))) ‘(1 2
(if (null? ‘(1 2)) ‘(1 2)
(cons (reverse (cdr ‘(1 2))) (car ‘(1 2))))
(cons (reverse ‘(2)) 1)
(cons 2 1)
Not the list (2 1)
(2 . 1)
27 February 2002
CS 200 Spring 2002
15
reverse
(define (reverse lst)
(if (null? lst) lst
(append (reverse (cdr lst))
(list (car lst)))))
(n)
27 February 2002
n times
reverse is (n2)
Challenge: Define a reverse
procedure that is (n) without
using
CS 200 mutation
Spring 2002
16
Environments
27 February 2002
CS 200 Spring 2002
17
(define nest
(lambda (x)
(lambda (x)
(+ x x))))
> ((nest 3) 4)
8
27 February 2002
CS 200 Spring 2002
Does the
substitution model
of evaluation tell
us how to evaluate
this?
18
Review: Names, Places, Mutation
• A name is a place for storing a value.
• define creates a new place
• cons creates two new places, the car and
the cdr
• (set! name expr) changes the value in the
place name to the value of expr
• (set-car! pair expr) changes the value in the
car place of pair to the value of expr
• (set-cdr! pair expr) changes the value in the
cdr place of pair to the value of expr
27 February 2002
CS 200 Spring 2002
19
Lambda and Places
• (lambda (x) …) also creates a new place
named x
• The passed argument is put in that place
> (define x 3)
> ((lambda (x) x) 4)
4
>x
3
27 February 2002
x:3
x:4
How are these
places different?
CS 200 Spring 2002
20
Location, Location, Location
• Places live in frames
• An environment is a pointer to a
frame
• We start in the global environment
• Application creates a new frame
• All frames except the global frame
have one parent frame
27 February 2002
CS 200 Spring 2002
21
Environments
global
environment
+ : #<primitive:+>
null? : #<primitive:null?>
x:3
The global environment points to the outermost
frame. It starts with all Scheme primitives.
> (define x 3)
27 February 2002
CS 200 Spring 2002
22
Procedures
global
environment
+ : #<primitive:+>
null? : #<primitive:null?>
x:3
double: ??
> (define double (lambda (x) (+ x x)))
27 February 2002
CS 200 Spring 2002
23
How to Draw a Procedure
• A procedure needs both code and an
environment
– We’ll see why soon
• We draw procedures like this:
Environment
pointer
Code pointer
parameters: x
body: (+ x x)
27 February 2002
CS 200 Spring 2002
24
Procedures
global
environment
+ : #<primitive:+>
null? : #<primitive:null?>
x:3
double:
> (define double
(lambda (x) (+ x x)))
27 February 2002
CS 200 Spring 2002
parameters: x
body: (+ x x)
25
Application
• Old rule: (Substitution model)
Apply Rule 2: Compounds. If the
procedure is a compound procedure,
evaluate the body of the procedure with
each formal parameter replaced by the
corresponding actual argument expression
value.
27 February 2002
CS 200 Spring 2002
26
Application
1. Construct a new frame, enclosed in the
environment of this procedure
2. Make places in that frame with the
names of each parameter
3. Put the values of the parameters in those
places
4. Evaluate the body in the new
environment
27 February 2002
CS 200 Spring 2002
27
1.
2.
3.
4.
Construct a new frame, global
environment
enclosed in the
environment of this
+ : #<primitive:+>
procedure
Make places in that
double:
x:3
frame with the names of
each parameter
Put the values of the
parameters in those
parameters: x
places
body: (+ x x)
Evaluate the body in the
new environment
x :4
> (double 4)
(+
x)
8 4x 4)
8
27 February 2002
CS 200 Spring 2002
28
global
environment
(define nest
(lambda (x)
(lambda (x)
(+ x x))))
> ((nest 3) 4)
+ : #<primitive:+>
x:3
x :3
nest:
parameters: x
body:
(lambda (x) (+ x x))
(nest 3) (x) (+ x x)) 4)
((lambda
x :4
(+ x x)
Evaluation Rule 2 (Names)
If the expression is a name, it evaluates to
the value associated with that name.
To find the value associated with a name,
look for the name in the frame pointed to by
the evaluation environment. If it contains a
place with that name, use the value in that
place. If it doesn’t, evaluate the name using
the frame’s parent environment as the new
evaluation environment. If the frame has no
parent, error (name is not a place).
27 February 2002
CS 200 Spring 2002
30
evaluate-name
(define (evaluate-name name env)
(if (null? env) (error “Undefined name: …”)
(if (frame-contains name (get-frame env))
(lookup name (get-frame env))
(evaluate-name name
(parent-environment
(get-frame env))))))
Hmm…maybe we can define a Scheme interpreter in Scheme!
27 February 2002
CS 200 Spring 2002
31
Charge
• Mutation makes evaluation rules more
complicated
• Environment diagrams quickly get
complicated – but like substitution
evaluations, just follow rules mechanically
• Read SICP Ch 3 (through p. 266)
• Get cracking on PS5
– Lab hours – Monday 8-9:30
• After Spring Break – we will define our own
Scheme interpreter!
27 February 2002
CS 200 Spring 2002
32