Transcript slides
M. C. Escher, Day and Night Lecture 18: Mutation CS200: Computer Science University of Virginia Computer Science David Evans http://www.cs.virginia.edu/~evans Menu • Mutation Primitives • PS 5 27 February 2002 CS 200 Spring 2002 2 From Lecture 3: Evaluation Rule 2: Names If the expression is a name, it evaluates to the value associated with that name. > (define two 2) > two 2 27 February 2002 CS 200 Spring 2002 3 Names and Places • A name is not just a value, it is a place for storing a value. • define creates a new place, associates a name with that place, and stores a value in that place (define x 3) 27 February 2002 CS 200 Spring 2002 x: 3 4 Bang! set! (“set bang”) changes the value associated with a place > > 3 > > 7 (define x 3) x x: 7 3 (set! x 7) x 27 February 2002 CS 200 Spring 2002 5 set! should make you nervous > (define x > (nextx) 3 > (nextx) 4 >x 4 27 February 2002 2) Before set! all procedures were functions (except for their side-effects). The value of (f) was the same every time you evaluate it. Now it might be different! CS 200 Spring 2002 6 Defining nextx (define (nextx) (set! x (+ x 1)) x) syntactic sugar for 27 February 2002 (define nextx (lambda () (begin (set! x (+ x 1)) x)))) CS 200 Spring 2002 7 Evaluation Rules > (define x 3) > (+ (nextx) x) 7 DrScheme evaluates or 8 application sub> (+ x (nextx)) 9 or 10 27 February 2002 CS 200 Spring 2002 expression left to right, but Scheme evaluation rules allow any order. 8 set-car! and set-cdr! (set-car! p v) Replaces the car of the cons p with v. (set-cdr! p v) Replaces the cdr of the cons p with v. These should scare you even more then set!! 27 February 2002 CS 200 Spring 2002 9 > (define pair (cons 1 2)) > pair (1 . 2) pair: 1 27 February 2002 CS 200 Spring 2002 2 10 > (define pair (cons 1 2)) > pair (1 . 2) pair: > (set-car! pair 0) > (car pair) 0 1 21 0 > (cdr pair) 2 > (set-cdr! pair 1) > pair (0 . 1) Any reason to be afraid yet? 27 February 2002 CS 200 Spring 2002 11 > pair (0 . 1) > (set-cdr! pair pair) > (car pair) pair: 0 > (car (cdr pair)) 0 > (car (cdr (cdr pair))) 0 > pair #0=(0 . #0#) 27 February 2002 CS 200 Spring 2002 2 1 1 pair 0 12 Functional Programming • Programming without mutation – Side-effects like printing and drawing on the screen are really mutations (of the display, printer, bell, etc.) • If an expression has a value, it is always the same – order of evaluation doesn’t matter • Substitution mode of evaluation works fine 27 February 2002 CS 200 Spring 2002 13 Imperative Programming • Programming with mutation (assignment) • Value of an expression might be different depending on when it is evaluated • Substitution model of evaluation doesn’t work anymore! 27 February 2002 CS 200 Spring 2002 14 Why Substitution Fails? (define (nextx) (set! x (+ x 1)) x) > (define x 0) > ((lambda (x) (+ x x)) (nextx)) 2 Substitution model: (+ (+ (+ (+ 0 (nextx) (nextx)) (begin (set! x (+ x 1)) x) (begin (set! x (+ x 1)) x)) (begin (set! 0 (+ 0 1)) 0) (begin (set! 0 (+ 0 1)) 0)) 0 0) 27 February 2002 CS 200 Spring 2002 15 Why would a programming language allow mutation? • Does it allow us to express computations we couldn’t express without it? No! We can express all computations without mutation. (We’ll see why before the end of the course…) • Mutation allows us to express some computations more naturally and efficiently 27 February 2002 CS 200 Spring 2002 16 Example • Count uses of letters in a message > (count-letters "this sentence does not have six esses") ((#\a . 1) (#\b . 0) … (#\r . 0) (#\s . 7) … (#\z . 0)) 27 February 2002 CS 200 Spring 2002 17 Constructing the Tally List (define (make-letter-tallys) (for (char->integer #\a) (char->integer #\z) (lambda (accum cno) (append accum (list (cons (integer->char cno) 0)))) null)) 27 February 2002 CS 200 Spring 2002 18 Imperative Solution (define (count-letters msg) (let ((letter-uses (make-letter-tallys))) (map (lambda (c) (insertlg (lambda (thisletter foundit) (if foundit foundit (if (eq? (car thisletter) c) (begin (set-cdr! thisletter (+ (cdr thisletter) 1)) #t) #f))) letter-uses #f)) (string->list msg)) letter-uses)) 27 February 2002 CS 200 Spring 2002 19 Functional Solution • Need to keep making new lists! • If you are not sure mutation is a good thing (and you shouldn’t be), try writing this yourself 27 February 2002 CS 200 Spring 2002 20 PS5 • Make a primosaic – Photomosaic that avoids reusing tiles • Change the tile selection to favor tiles that have not been used much • Keep track of how many tiles each tile is used – Mutate the list of tiles each time a tile is selected as the best tile 27 February 2002 CS 200 Spring 2002 21 Charge • PS5 – You know everything you need to do it after today, so start early! – More open ended than previous problem sets • Thursday, 3:30 in Wilson 402 – Talk by Steven Pinker, The Blank Slate, the Noble Savage, and the Ghost in the Machine • Friday – A model of computation and evaluation rules that work with mutation 27 February 2002 CS 200 Spring 2002 22