このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

オブジェクトとクラス、とりあえずご質問に答えます

「いまさらながらだけど、オブジェクトとクラスの関係を究めてみようよ」には、いろいろとフィードバックがありまして、僕もそれらに触発されたところもあるので、お応えしたい気もするのですが、なかなかにねー、、、エネルギーが足りないや。

とりあえず、明白に質問(疑問文)の形をしたものに答えます。

higeponさんの:

今日お話に出ていたCommonLisp(?)のすごいコードのお話ってどの辺に書かれていますでしょうか?

aufhebenさんの:

  • レイフィケーションとパワータイプって同じような概念ととらえてよいのかな?
  • 檜山さんのエントリで、is-created-by とレイフィケーションは、他の関係と矢印の向きが逆な気がするんですけど、何か意図があるのでしょうか?

id:higeponさんの質問は、当該エントリーとは別な文脈でのものですが、一連の流れとしては関連するので。


もし、「いまさらながらだけど、オブジェクトとクラスの関係を究めてみようよ」の続編を書くとしたら(書かないけどね)、MetaObject Protocol(MOP)とかMeta-Circular Interpreterの話かなぁー、とか漠然と思って、なにげに調べてみればCLOS(Common Lisp Object System; クロス、シーロス)なんてもんが引っかかるわけです。

で、こっからは調べた結果とかではなくて、僕の曖昧な記憶(追憶)なんですが、

  1. そういえば、CLOSのプロトタイプ、あるいは前身となるシステムがあったよな。
  2. それはゼロックスから配られていたと思う。
  3. そのコードが「すげー」という話を知り合いから聞いた。

Common LispもCLOSも、1980年代にだいたいの形はできていたので、今から20年も昔のことです。その話をhigeponさんと雑談したのですが、

  • 今はAspectJの主謀者であるキクザレス(Gregor Kiczales)が中心人物の一人だったような、、、

てなことも話しました。

それで、そのゼロックスが配っていた「すげーコード」とはなにか? なにしろ大昔の間接伝聞なので、事情がハッキリしませんが、もろもろの状況から推理推論するに、Portable CommonLoops じゃないかと思います。

当時(1980年代)僕は、締め切り/納期の世界で地べたをはいつくばってゲロ吐いていたので、MOPもMeta-Circularもありゃしなかったのですが、ゼロックスの「すげーコード」は、

  1. 高速で、
  2. 移植性が高く、
  3. 柔軟

とか聞いて、「それ食えるなら、一回食ってみたいもんだ」とかあこがれていたんですわ。


  • レイフィケーションとパワータイプって同じような概念ととらえてよいのかな?

パワータイプって知らないです。今しがた見た、通りいっぺんの定義を信用するなら、「サブタイプ(クラスならサブクラス)全体からなるタイプ」ですよね。概念としてレイフィケーションとは全然違いますが、無関係ではありません。

一般のタイプではなくて、オブジェクトとクラスの例で話すなら、PがクラスCのパワータイプ(パワークラス?)になっているとは、

  • X is-subclass-of C ならば、X is-instance-of P
  • X is-instance-of P ならば、X is-subclass-of C

が成立することです(たぶん)。

CやX(いろんなXがある)が、クラスプレーン上に乗っているとすると、Pはそれらのクラス達と is-instance-ofという“垂直方向”の関係で結ばれるので、一階上のフロアであるメタクラスプレーンにいるはずです。つまり、クラスのパワータイプはメタクラスです。

パワータイプPをレイフィイすれば、クラスプレーンに落ちて、is-subclass-ofもis-instance-ofも同じプレーン内の“水平方向”の関係となるので、2次元内に図示できるはずです(図示はお任せします :-))。2次元内に、is-subclass-ofとis-instance-ofを同じ矢印で描いたりすると、CとP(のレイフィケーション・イメージ)は区別しにくい絵になるでしょうね。

  • 檜山さんのエントリで、is-created-by とレイフィケーションは、他の関係と矢印の向きが逆な気がするんですけど、何か意図があるのでしょうか?

is-subclass-ofとかis-instance-ofは、二者のあいだの関係/関連性(relationship)なんだけど、is-created-byとreificationは、なんらかのアクションを絵に描いた感じ。

生成(is-created-by)の矢印では、クラスをニワトリ、オブジェクトを卵だと思ってください。波線の矢印は、卵が生まれ落ちてコロンコロン転がるところを描いたわけね。

レイフィケーションは、メタな世界=天上界の存在が、地上に落ちていくさまを描いたんですね。天使が天上界からピューッと地上に落ちて(堕ちて)くるところ、とかね。(すると、クラスオブジェクトは堕天使か?)

まー、雰囲気/感じの問題で、さほどの意味はありません。