エントリ投入
twitter 経由にて sw@mac の中の人から報せが入りますた。力作です。
最初に square という名前に紐付けられた手続きオブジェクトの図と手続きの定義を例示しています。ぼくは以前 SICP を読んだ時にここまで考えて見てなかったですな。
昨晩エントリでも申し上げた通り、lambda 式はそれ自身が評価される時に
- 仮引数と手続き定義
- lambda 式が評価された時点の環境
を一括りにして持ってます。この図が非常に分かりやすい。あるいはこの図も同様ですね。
で
本題の以下のソレを確認。
(define make-withdraw (lambda (initial-amount) ((lambda (balance) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient funds"))) initial-amount)))
あるいは以下のソレか。
(define W1 (make-withdraw 100)) (W1 50) (define W2 (make-withdraw 100))
ええと、make-withdraw が束縛しているのはこの図の通りですわな。
で、W1 が define される時に何が起きるか、というのが本題。評価される順に列挙してみます。とりあえず上記の図の部分から。
- make-withdraw という名前に手続きオブジェクトが束縛される
- 仮パラメータは initial-amount
- 手続き本体については略
- 環境は大域
で、その中身なんですが
- まず手続きオブジェクトについて
- 仮引数 (initial-amount) と実引数 (100) の束縛なナニを作って環境を extend
- 手続きを実行
という形となります。この時点で initial-amount が 100 な環境 E1 ができます。次に
((lambda (balance) (lambda (amount) <body>))) initial-amount)
な手続きの評価をしていくのですが、最初に lambda 式が評価されます
- 仮パラメータは balance
- lambda 式を戻す手続き
- 環境は E1
な手続きオブジェクトが作られて
- 仮引数と実引数の束縛なソレで環境を extend
- この時、initial-amount という名前が束縛されるのか、initial-amount が eval された値が束縛されるのかは処理系マター?
- 手続き (lambda 式を戻す) を実行
という事で extend された E2 ができる、と。
いやはや
昨晩は本当に勉強になりました。ありがとうございました。