(define meter1
   (let ((amount 0))
      (lambda ()
         (lambda (m)
            (cond ((equal? m 'deposit)
                     (set! amount (+ amount .25)))
                  ((equal? m 'total) amount)
                  ((equal? m 'collect)
                     (let ((amt amount))
                        (set! amount 0)
                        amt))
                  (else 'Eh?))))))
                   

(define meter2
   (lambda ()
      (let ((amount 0))
         (lambda (m)
            (cond ((equal? m 'deposit)
                     (set! amount (+ amount .25)))
                  ((equal? m 'total) amount)
                  ((equal? m 'collect)
                     (let ((amt amount))
                        (set! amount 0)
                        amt))
                  (else 'Eh?))))))


(define p1 (meter1))
(define p2 (meter1))

(define q1 (meter2))
(define q2 (meter2))
  1. What is the difference between how meter1 and meter2 work? (Hint: Do testing with p1, p2, q1, and q2.)
  2. What is the technical term for the variable amount in meter1?
  3. What keyword in Java is associated with the variable amount in meter1?
  4. What is the technical term for the variable amount in meter2?
  5. Draw an environment diagram for meter1, meter2, p1, p2, q1, and q2. (You will probably need a whole sheet of paper to do this as there is a lot of stuff to draw.)
  6. Can you tell from the diagram why it is that the different types of parking meters behave as they do?
(define meter3
   (let ((total-amount 0))
      (lambda ()
        (let ((amount 0))
          (lambda (m)
            (cond ((equal? m 'deposit)
                   (set! amount (+ amount .25))
                   (set! total-amount (+ total-amount .25)))
                  ((equal? m 'amount) amount)
                  ((equal? m 'total) total-amount)
                  ((equal? m 'collect)
                   (let ((amt amount))
                     (set! total-amount (- total-amount amount))
                     (set! amount 0)
                     amt))
                  (else 'Eh?)))))))

(define a1 (meter3))
(define a2 (meter3))