クロージャ vs オブジェクト

クロージャはこないだの台風並みに乱暴に言えば、無名関数で、関数ポインタで、無名内部クラスで、手続きを [ ] で括っただけのものだったりする一方で、アクター、ひいてはオブジェクトと理屈では等価なものだったりもするわけです。三段論法的には関数とオブジェクトは同じ?ってなわけで、じつに不思議です。さっきのカウンタを、同じ仕組みをもつオブジェクト(a Counter)で表現するとこんな感じになります。

counter1 counter2
counter1 := Counter newCount: 0. counter2 := Counter newCount: 100. ActiveWorld findATranscript: ActiveEvent. 10 timesRepeat: [ Transcript cr; show: counter1 count. Transcript tab; show: counter2 count]

ポール・グラハムがらみでどこかにも書きましたが、目の前の汚いものをすべて覆い隠してくれる雪…ならぬ、「すべてを“オブジェクト”と、それへの“メッセージ送信”で表現すべし」とするドグマの信奉者としては、どーでもいいものはどんどん別レイヤーに追いやって“なかったもの”ならぬ“最初からあったもの”としてしまう、やはりこちらのほうが美しい…かな、と(笑)。

そんなことをつらつらと考えるに、スクリプト中でどんどんクラスとかメソッドを定義してゆくスクリプト言語でのスタイルや、次世代の SqueakIDE が目指すものが(スクリプト言語処理系ならそうなくてはならないし、慣れという要素をさっ引いてなお、それはそれで便利だということを分かっていても)なぜか自分にはピンと来ない…、というか、はっきり言えば“嫌い”なのとちょっと関係あるかも…とも。

で、以下が“別レイヤー”に追いやった汚いモノ(笑)。

'From SqueakNihongo6.1'!
Object subclass: #Counter
  instanceVariableNames: 'count '
  classVariableNames: ''
  poolDictionaries: ''
  category: 'Category-ObjectVsClosure'!

!Counter methodsFor: 'counting'!
count
  ^ count _ count + 1! !

!Counter methodsFor: 'private'!
setCount: initialInteger
  count _ initialInteger! !


!Counter class methodsFor: 'instance creation'!
newCount: initialInteger
  ^ self new setCount: initialInteger; yourself! !