sicp-ex-3.3-3.4


 (define (make-account balance password) 
   (let ((bad-passwords 0)) 
     (define (withdraw amount) 
       (if (>= balance amount) 
           (begin (set! balance (- balance amount)) 
                  balance) 
           (print "Insufficient funds"))) 
     (define (deposit amount) 
       (set! balance (+ balance amount)) 
       balance) 
     (define (dispatch p m) 
       (if (good-password? p) 
           (cond ((eq? m 'withdraw) withdraw) 
                 ((eq? m 'deposit) deposit) 
                 (else (error "Unknown request -- MAKE-ACCOUNT" m))) 
           (lambda (x) (print "Incorrect password") (newline)))) 
     (define (good-password? p) 
       (cond ((eq? p password) 
              (set! bad-passwords 0) 
              true) 
             ((< bad-passwords 7) 
              (set! bad-passwords (+ bad-passwords 1)) 
              false) 
             (else 
              (call-the-cops)))) 
     (define (call-the-cops) 
       (print "Cops called!") 
       false) 
     dispatch))