-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path3_48.scm
33 lines (31 loc) · 1.08 KB
/
3_48.scm
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
30
31
32
33
#lang sicp
(define (make-account-and-serializer balance account-no)
(define (withdraw amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds"))
(define (deposit amount)
(set! balance (+ balance amount))
balance)
(let ((balance-serializer (make-serializer)))
(define (dispatch m)
(cond ((eq? m 'withdraw) withdraw)
((eq? m 'deposit) deposit)
((eq? m 'balance) balance)
((eq? m 'account-no) account-no)
((eq? m 'serializer) balance-serializer)
(else (error "Unknown request: MAKE-ACCOUNT" m))))
dispatch))
(define (serialized-exchange account1 account2)
(let ((serializer1 (account1 'serializer))
(serializer2 (account2 'serializer))
(account-no1 (account1 'account-no))
(account-no2 (account2 'account-no)))
(if (< account-no1 account-no2)
((serializer2 (serializer1 exchange))
account1
account2)
((serializer1 (serializer2 exchange))
account1
account2))))