ASAHIネット(
[URL]のjouwa/salonからホットコーナー(
[URL] )に転載したものから。
---
[URL]
オブジェクトは難しくない。難しいのはクラス
で話題にしてあるRubyの特異メソッドは、Common LispのCLOS(Common Lisp
Object System, クロスやシーロスと読む) では、defmethodのeql specializerで実現できる。
というか、Common Lispのeql specilizerをRubyで実装したのが、特異メソ
ッドだと思う。
CLOSのeql specializerの例を
[URL]
に置いたので、みてください。
defmethodの説明は、
[URL]
Common Lisp HyperSpec
の
[URL]
defmethod
をどうぞ。その説明にあるeql-specializer-formが、Rubyでいう特異メソッド
です。
先に進む前にちょっと疑問。上記で参照されている
[URL]
perl - Object::PrototypeでPOMを実装
のドンペンの例は、特異メソッドの例になってるの? 単にメソッドのオーバ
ーライドの例にしかみえないんだけど。
では、先に進むが、以下、Lispと書いたらCommon Lispのことと思ってくだ
さい。Lispの2大標準のもう一方であるSchemeは、この場合、含まれないので。
CLOSの場合、他のオブジェクト指向言語と大いに違うのは、メソッドはクラ
スに縛られていないこと。クラスには属していないのだ。
これが、オプジェクト指向といえば、クラスにメソッドが属するものだと思
い込んでいる人には、驚きだろう。CLOSは、クラスにメソッドが属しているオ
ブジェクト指向の一般化になっているのである。
昔、電脳騒乱節で、ヒューイット先生のアクターモデルを知ると、
Smalltalk(そしてほとんどのオブジェクト指向言語)の継承は、メッセージを
誰が処理するかを、クラスの先祖をたどる方向に固定したものなのがわかるな
んてことを書いた記憶がある。
弾さんがいうように、
Too Many Ways to Implement Object Systems
は、その通り。
だから、あんまり思考に枠をはめずに考えるほうがいい。
果たしてそんな頭をほぐすのに役立つかどうかわからないが、簡単にCLOSの
モデルを説明してみよう。
CLOSでは、メソッドはクラスに属していないと書いた。
だから、Lispでは、クラスがなくてもメソッドは定義できるし、メソッドに
クラスのインスタンスではなく、通常のLispオブジェクトを渡して処理するこ
ともできる。
逆に、通常の関数でクラスのインスタンスを受け取って処理することもでき
る。
メソッドの呼び出しと通常の関数の呼び出しは構文上も区別がつかない。
CLOSは、非常にシームレスに従来のLisp上に作られていることがわかる。
したがって、
Perl5最大の欠点:Object Systemが後付けなこと。
Perl5最大の利点:Object Systemが後付けなこと。
というのは、Lispも同じ。ただ、それがマクロで作られているところがLispの
すごさ。そして、標準化されているところがPerlとの大きな違い。
さて、メソッドは、何に属しているかというと、総称関数(generic
function)と呼ばれるものに属している。
そして、いつ、メソッドがクラスと結びつくかといえば、実行時に動的に結
びつく。
パラメータとしてメソッドに渡されたオブジェクトをみて、一番ふさわしい
メソッドが呼ばれる。
当然、パラメータは複数でもよく、それら全部を調べて、最適なメソッドを
選んで実行する。
セコメントをする