Chapter 3, Modularity, Objects, and State

Exercise 3.4


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#lang sicp

(#%require (only racket/base error))

(define (make-account balance secretpwd)
  (let ((times 0))
   (define (withdraw amount)
     (if (>= balance amount)
         (begin (set! balance (- balance amount))
                balance)
         "Insufficient funds"))
   (define (deposit amount)
     (set! balance (+ balance amount))
     balance)
   (define (dispatch pwd m)
     (if (eq? secretpwd pwd)
         (begin (set! times 0)
           (cond ((eq? m 'withdraw) withdraw)
               ((eq? m 'deposit) deposit)
               (else (error "Unknown request -- MAKE-ACCOUNT"
                            m))))
         (if (> times 6)
             (begin (call-the-cops) (error "Some error happend. Please wait..."))
             (begin (set! times (+ times 1))
                    (error "Invalid Password")))))
  dispatch))

(define (call-the-cops)
  (error "Cops coming!"))