Announcements
Last Quiz Review
Tonight, 7pm, Room 26-168 and 26-314
Quiz One
TOMORROW from 5-7pm xor 7-9pm, Walker Gym
Java
It's on its way. Start learning on your own.
SET! Introduces Time and Change
(SET! <name> <value expression>)
- Calculate the value of value expression.
- Change the binding of name so that it is that
value.
- While the SET! has a value (mantra 1), Scheme doesn't
specify what that value is.
Today's Example
(define make-adder | (define make-counter
(lambda (x) | (lambda (balance)
(lambda (y) | (lambda (amt)
(+ x y)))) | (set! balance
| (+ balance amt))
| balance)))
The GOOD: Modularity
(define random-init 7)
(define rand
(let ((x random-init))
(lambda ()
(set! x (rand-update x))
x)))
"Functional" Version
(define (estimate-pi trials)
(sqrt (/ 6 (random-gcd-test trials random-init))))
(define (random-gcd-test trials initial-x)
(define (iter trials-remaining trials-passed x)
(let ((x1 (rand-update x)))
(let ((x2 (rand-update x1)))
(cond ((= trials-remaining 0)
(/ trials-passed trials))
((= (gcd x1 x2) 1)
(iter (- trials-remaining 1)
(+ trials-passed 1)
x2))
(else
(iter (- trials-remaining 1)
trials-passed
x2))))))
(iter trials 0 initial-x))
Hidden State Gives Modularity
(define (estimate-pi trials)
(sqrt (/ 6 (monte-carlo trials cesaro-test))))
(define (cesaro-test)
(= (gcd (rand) (rand)) 1))
(define (monte-carlo trials experiment)
(define (iter trials-remaining trials-passed)
(cond ((= trials-remaining 0)
(/ trials-passed trials))
((experiment)
(iter (- trials-remaining 1)
(+ trials-passed 1)))
(else
(iter (- trials-remaining 1)
trials-passed))))
(iter trials 0))
The BAD: New kinds of bugs
(define (fact n)
(let ((product 1)
(counter 1))
(define (iter)
(if (> counter n)
counter
(begin
(set! product (* product counter))
(set! counter (+ counter 1))
(iter))))
(iter)))