acount-numberをどう管理するか迷った.
- 大域変数で管理するか
- balanceと同じように,口座を作るときに,指定するか.
今回は1を選択した.
;;exercise3.48 (define account-number 1) (define (make-accout-and-serializer balance) (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 'serializer) balance-serializer] [(eq? m 'number) account-number] [else (error "Unknown request -- MAKE-ACCOUNT" m)])) (inc! account-number) dispatch)) (define (deposit account amount) (let ((s (account 'serializer)) (d (account 'deposit))) ((s d) amount))) (define (exchange account1 account2) (let ((difference (- (account1 'balance) (account2 'balance)))) (if (> difference 0) (begin ((account1 'withdraw) difference) ((account2 'deposit) difference)) (begin ((account1 'deposit) difference) ((account2 'withdraw) difference))))) (define (serialized-exchange account1 account2) (let ((serializer1 (account1 'balance-serializer)) (serializer2 (account2 'balance-serializer))) ((serializer1 (serializer2 exchange))) account1 account2)) (define (serialized-exchange account1 account2) (define (serialized-exchange-core account1 account2) (let ((serializer1 (account1 'balance-serializer)) (serializer2 (account2 'balance-serializer))) ((serializer1 (serializer2 exchange))) account1 account2)) (let ((account-num1 (account1 'account-number)) (account-num2 (account2 'account-number))) (if (>= account-num1 account-num2) (serialized-exchange-core account1 account2) (serialized-exchange-core account2 account1))))
次の3.5は遅延評価.わからなくなったら,id:maoe先生に質問する.
はてなでの仕事でもいつも聞いているんですが...