こんな感じで,関数内の関数定義があったら,環境モデルはどうなるかという話.
(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
(define acc2 (make-account 100))