さかもとのブログ

つらつらと

SICP演習問題3.49

acount-numberをどう管理するか迷った.

  1. 大域変数で管理するか
  2. 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先生に質問する.
はてなでの仕事でもいつも聞いているんですが...