Blob


1 (define (exchange account1 account2)
2 (let ((difference (- (account1 'balance)
3 (account2 'balance))))
4 ((account1 'withdraw) difference)
5 ((account2 'deposit) difference)))
7 (define (make-account-and-serializer balance)
8 (define (withdraw amount)
9 (if (>= balance amount)
10 (begin (set! balance (- balance amount))
11 balance)
12 "Insufficient funds"))
13 (define (deposit amount)
14 (set! balance (+ balance amount))
15 balance)
16 (let ((balance-serializer (make-serializer)))
17 (define (dispatch m)
18 (cond ((eq? m 'withdraw) withdraw)
19 ((eq? m 'deposit) deposit)
20 ((eq? m 'balance) balance)
21 ((eq? m 'serializer) balance-serializer)
22 (else (error "Unknown request -- MAKE-ACCOUT"
23 m))))
24 dispatch))
26 (define (deposit account amount)
27 (let ((s (account 'serializer))
28 (d (account 'deposit)))
29 ((s d) amount)))
31 (define (serialized-exchange account1 account2)
32 (let ((serializer1 (account1 'serializer))
33 (serializer2 (account2 'serializer)))
34 ((serializer1 (serializer2 exchange))
35 account1
36 account2)))