1 (define (exchange account1 account2)
2 (let ((difference (- (account1 '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))
12 "Insufficient funds"))
13 (define (deposit amount)
14 (set! balance (+ balance amount))
16 (let ((balance-serializer (make-serializer)))
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"
26 (define (deposit account amount)
27 (let ((s (account 'serializer))
28 (d (account 'deposit)))
31 (define (serialized-exchange account1 account2)
32 (let ((serializer1 (account1 'serializer))
33 (serializer2 (account2 'serializer)))
34 ((serializer1 (serializer2 exchange))