Gauche:MOP
yamasushi(2013/04/21 03:27:29 UTC)ここに、gaucheに特化したようなmopの情報をまとめることにします。
- 詳細なMOPについての情報についてはScheme:MOP、Scheme:メタオブジェクトプロトコルを参照してください。
- "Metaobject protocol"(MOP)ってなに?
- 関連ファイル
- 概要
- 解説
- チュートリアル
- 応用
- スロットアクセスの伝播
- シングルトン
- Validator付きスロット
- Scheme:MOP:InstancePool Gauche:MOP:InstancePool
- Scheme:MOP:パラメタライズドクラス
- Scheme:MOP:ProfiledGeneric
- その他
- イディオム
"Metaobject protocol"(MOP)ってなに?
- Scheme:メタオブジェクトプロトコル
オブジェクトシステムの強みのひとつは、フレームワークをベースクラスで 作っておいて、継承やメソッドオーバロード、あるいはコンポジションによって アプリケーションにフレームワークを適応してゆけるということだよね。 それを、「オブジェクト指向言語そのもの」に適用したのがMOPだ。
MOPでは、クラスやメソッドと言ったオブジェクトシステムの基本要素が そのオブジェクトシステム自身を使って定義されている。 で、例えばクラスが定義される時にはどういうメソッドがどういう順番で 呼ばれ、それらは何をすることを望まれているかというのが明文化されている。 適宜それらのメソッドをオーバロードしてやることで、 書こうとしているアプリケーションの問題領域に適するようにオブジェクトシステムの 振舞いを変更することができるのだ。
- WikipediaEn:Metaobject
Metaobject protocol A metaobject protocol (MOP) is an interpreter of the semantics of a program that is open and extensible. Therefore, a MOP determines what a program means and what its behavior is, and it is extensible in that a programmer (or metaprogrammer) can alter program behavior by extending parts of the MOP. The MOP exposes some or all internal structure of the interpreter to the programmer. The MOP may manifest as a set of classes and methods that allow a program to inspect the state of the supporting system and alter its behaviour. MOPs are implemented as object-oriented programs where all objects are metaobjects.
- WikipediaJa:メタクラス WikipediaEn:Metaclass
オブジェクト指向プログラミングにおいてメタクラスとは、インスタンスがクラスとなるクラスのことである。通常のクラスがそのインスタンスの振る舞いを定義するように、メタクラスはそのインスタンスであるクラスを、そして更にそのクラスのインスタンスの振る舞いを定義する。全てのオブジェクト指向プログラミング言語でメタクラスが利用できるわけではない。利用できるものの中でもクラスの振る舞いが定義できる範囲は様々である。
各言語はそれぞれ独自のメタオブジェクトプロトコル(MOP)を備えている。メタオブジェクトプロトコルとは、クラスそのものの挙動をもオブジェクト指向のルールで記述し、初期化やインスタンス化のルール、実行状態の管理などをカスタマイズする機構である。Smalltalk、CLOSが代表的である。
- GaucheRefj:メタオブジェクトプロトコル GaucheRefe:Metaobject protocol
CLOS 風のオブジェクトシステムでは、オブジェクトシステムがそれ自身の上に 構築されます。すなわち、クラス構造のようなもの、クラスをどのように 生成するか、インスタンスをどのように生成し初期化するか、メソッドをどのように ディスパッチし呼び出すか、これらはすべてオブジェクトシステムによって、 定義されます。たとえば、クラスはジェネリックな構造と標準的クラスの 振舞いを定義する <class> クラスのインスタンスです。<class> をサブクラス化すると、デフォルトのものとは違う振舞いをする、独自の クラス集合をつくることができます。これは結局、独自のオブジェクトシステムを つくることになります。
メタオブジェクトプロトコルは、どのようにオブジェクトシステムを 構築するかに関連する API 群の定義です。ブロック構築のクラス、オブジェクト システムを操作するあいだに呼ばれるジェネリック関数の名前と順序などです。 これらのクラスをサブクラス化し、これらのメソッドを特定化することは、 オブジェクトシステムの振舞いをカスタマイズすることを意味します。
関連ファイル
- GaucheSource:lib/gauche/mop/propagate.scm
- GaucheSource:lib/gauche/mop/singleton.scm
- GaucheSource:lib/gauche/mop/validator.scm
- SearchGaucheSource:mop
概要
解説
チュートリアル
- メタオブジェクトプロトコル - karetta.jp
http://karetta.jp/book-node/gauche-hacks/006919
- メタクラスの作成 - karetta.jp
http://karetta.jp/book-node/gauche-hacks/007476
- インスタンス化のカスタマイズ - karetta.jp
http://karetta.jp/book-node/gauche-hacks/007132
- メソッド適用のカスタマイズ - karetta.jp
http://karetta.jp/book-node/gauche-hacks/006923
- メタクラスの作成 - karetta.jp
応用
スロットアクセスの伝播
GaucheRefj:gauche.mop.propagate GaucheRefe:gauche.mop.propagate
シングルトン
GaucheRefj:gauche.mop.singleton GaucheRefe:gauche.mop.singleton
Validator付きスロット
GaucheRefj:gauche.mop.validator GaucheRefe:gauche.mop.validator
仮想スロットに似ていますが、validatorを持つスロットはインスタンス内に実際に 値を格納している点が異なります。
このモジュールはまた、スロットのアクセスをメタオブジェクトプロトコルを使って カスタマイズする例でもあります。この機能は20行ほどのコードで実現されています。
Scheme:MOP:InstancePool Gauche:MOP:InstancePool
Scheme:MOP:パラメタライズドクラス
目的
「文字列のみを要素に持つリスト」とか、 「整数のみを要素に持つベクタ」とかいうクラスが欲しいことがたまにある。
強い型付き言語だとこういうクラスを多用するが、 Schemeではそのへんは運用で何とかしてしまう場合が多い。 しかし、規模が大きくなってきてデータの境界条件をきちんとマネージしたい 場合や、メタデータを用いていろいろやりたい場合には、型が「何でも有り」 だと困ることもある。