SICPノート (1) -- closures

数日前より長らく積ん読にしてあった SICP を読み出しました。こちらとしては手っ取り早くエッセンスだけ得られればいいので、むつかしい問題は飛ばしまくりなわけですが、第3章の頭ぐらいまで読み進めて、クロージャというものについて色々わかってきたので、とりえあずノート。

その理解は間違ってる!ってのがあれば、ツッコミ頂けると有難いです。では。


クロージャは、データ(状態変数)格納部として binding(環境)を使用したオブジェクト、と考えることができる。
それ自体は手続き(またはその集合)なので、データ+手続きで(オブジェクト指向における)オブジェクトの要件を満たす。

オブジェクト クロージャ
状態変数の格納場所 インスタンス binding(環境)
手続きの定義場所 クラス それ自体

オブジェクト指向における)オブジェクトとクロージャの違いは、「状態変数と手続きの集合をそれぞれどこに、どのように保持しているか」の違いでしかない。オブジェクトを「メッセージに応答することが可能なデータ」と緩く定義すれば、クロージャもオブジェクトと考えることができる。

それ自体に手続きの定義もあるという点では、クロージャはプロトタイプベースのオブジェクト指向言語JavaScript とか)のオブジェクトにより近い。↓みたいなコードを見ると特にそう感じる。*1

(define (make-monitored f)
  (let ((counter 0))
    (define (dispatch m)
      (cond ((eq? m 'how-many-calls?) counter)
            ((eq? m 'reset-count) (set! counter 0))
            (else (begin (set! counter (+ counter 1))
                         (f m)))))
    dispatch))

というか、オブジェクトもクロージャも、メッセージパッシングを実現するための2つの異なるアプローチなので(多分)、結果として得られるもの(メッセージに応答するデータオブジェクト)が、利用する側から見て同じ振舞いをするのは当然の帰結であり、両者が「似てる」なんて取り立てていうのもおかしな話。


計算機プログラムの構造と解釈

計算機プログラムの構造と解釈

*1:問題3.2の解答