理系学生日記

おまえはいつまで学生気分なのか

問題3-11 (3.2.4 Internal Definitions)

こんな感じで,関数内の関数定義があったら,環境モデルはどうなるかという話.

(define (make-account balance)
  (define (withdraw amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds"))
  (define (deposit amount)
    (set! balance (+ balance amount))
    balance)
  (define (dispatch m)
    (cond ((eq? m 'withdraw) withdraw)
          ((eq? m 'deposit) deposit)
          (else (error "Unknown request -- MAKE-ACCOUNT"
                       m))))
  dispatch)
(define acc (make-account 50))

accはグローバル環境に作られて,たぶんだけど関数本体 (ここではdispatch)を指すようになるはず.そのdispatchは新たな環境内でbindされている.

((acc 'deposit) 40)
90

まずdispatchが引数depositとともに呼び出されて,それがdepositの呼び出しを引き起こす.
どちらも新たな環境を作るけど,その親となる環境は同じ.

((acc 'withdraw) 60)
30

withdrawが呼び出される以外は同じ.

(define acc2 (make-account 100))

acc2はacc1とは異なる環境を用いる.