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>)
  1. Calculate the value of value expression.
  2. Change the binding of name so that it is that value.
  3. 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)))