Implement till 3.4

main
Felix Martin 2020-12-12 10:06:01 -05:00
parent a92aa63fc1
commit 5c39a8d48f
1 changed files with 82 additions and 0 deletions

82
ex-3_01-xx.scm Normal file
View File

@ -0,0 +1,82 @@
(load "util.scm")
(display "\nex-3.1\n")
(define (make-accumulator value)
(define (accumulate new-value)
(set! value (+ value new-value))
value)
accumulate)
(define A (make-accumulator 5))
(assert (A 10) 15)
(assert (A 10) 25)
(display "\nex-3.2\n")
(define (make-monitored proc)
(define count 0)
(define (dispatch m)
(cond ((eq? m 'how-many-calls?) count)
((eq? m 'reset-count) (set! count 0) count)
(else (set! count (inc count))
(proc m))))
dispatch)
(define s (make-monitored sqrt))
(assert (s 100) 10)
(assert (s 9) 3)
(assert (s 'how-many-calls?) 2)
(s 'reset-count)
(assert (s 'how-many-calls?) 0)
(display "\nex-3.3\n")
(define (make-account balance password)
(define invalid-pw-attempts 0)
(define (withdraw amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds"))
(define (deposit amount)
(set! balance (+ balance amount))
balance)
(define (incorrect-password value)
"Incorrect password")
(define (call-the-cops value)
"Call the cops!")
(define (dispatch pw m)
(if (eq? pw password)
(begin
(set! invalid-pw-attempts 0)
(cond
((eq? m 'withdraw) withdraw)
((eq? m 'deposit) deposit)
(else (error "Unknown request -- MAKE-ACCOUNT" m))))
(cond
((= invalid-pw-attempts 3) call-the-cops)
(else
(set! invalid-pw-attempts (inc invalid-pw-attempts))
incorrect-password))))
dispatch)
(define acc (make-account 100 'secret-password))
(assert ((acc 'secret-password 'withdraw) 40) 60)
(assert ((acc 'some-other-password 'deposit) 50) "Incorrect password")
(display "\nex-3.4\n")
((acc 'some-other-password 'deposit) 50)
(assert ((acc 'secret-password 'deposit) 50) 110)
((acc 'some-other-password 'deposit) 50)
((acc 'some-other-password 'deposit) 50)
((acc 'some-other-password 'deposit) 50)
(assert ((acc 'some-other-password 'deposit) 50) "Call the cops!")
(display "\nex-3.5\n")