;CHAPTER 3
;3.1
(define (make-accumulator x)
(lambda (y) (begin (set! x (+ x y))
x)))
(define A (make-accumulator 5))
;3.2
(define (make-monitored f)
(define (mmf count)
(lambda (x)
(cond ((eq? x 'how-many-calls) count)
((eq? x 'reset-count) (set! count 0))
(else (begin (set! count (+ 1 count))
(f x))))))
(mmf 0))
(define s (make-monitored sqrt))
;3.3 3.4
(define (make-account balance password)
(define count 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 pas m)
(if (eq? pas password)
(cond ((eq? m 'withdraw) withdraw)
((eq? m 'deposit) deposit)
(else "Unknow request -- MAKE-ACCOUNT"))
(begin (set! count (+ 1 count))
(if (> count 7)
call-the-cops
do-nothing))))
dispatch)
(define acc (make-account 100 'secret-password))
(define do-nothing (lambda (x) '()))
(define call-the-cops (lambda (x) 'call-the-cops))