Common Lisp Object System
Common Lisp Object System(CLOS)は、ANSI Common Lisp (CL) の一部をなすオブジェクト指向プログラミング機能であり、他の類似の言語(EuLisp や EmacsLisp)にも導入されている[1]。当初アドオンとして提案され、ANSIの標準に組み込まれた。CLOS は動的オブジェクトシステムであり、C++やJavaのような静的なオブジェクト指向言語とは大きく異なる。初期のLISPオブジェクトシステム(MIT Flavors や Common LOOPS)に影響されているが、より汎用的である。この汎用性を持たせることが難しい点である。
- LISPにオブジェクト指向を導入することは簡単である。2ページ程度のコードがあれば実現できる(Graham, 1994)。オブジェクト指向LISPを柔軟で拡張性に富んだものにするのはもっと難しい。CLOS は完全なオブジェクトシステムであり、オブジェクト指向風に実装されている。CLOS のオブジェクト指向実装は CLOS Metaobject Protocol (MOP) と呼ばれ、これによってカスタマイズや拡張が可能となっている。[2]
CLOS は多重ディスパッチシステムである。すなわち、引数のデータ型によってメソッドを用意できる。多くのオブジェクト指向言語は単一ディスパッチであり、メソッドは第一引数のデータ型でしか多重化できない。CLOS のメソッドは総称関数にグループ化される。総称関数は同じ名前と引数構造を持つ(ただし個々の引数のデータ型が異なる)メソッドを集めたものである。
多くの動的オブジェクト指向言語(Pythonなど)と同様、CLOS ではカプセル化が行われない。任意のデータ(スロット)に slot-value
関数でアクセス可能である。CL のプログラマはパッケージ機能を使って外部に見せるデータ構造や関数を宣言する。
通常のメソッド以外に、:before
メソッド、:after
メソッド、:around
メソッドがある。これらは派生クラスで実行するメソッドの順序を変更する。:around
メソッドは主メソッドを実行するかしないかを指定できる。また、クラス階層上の全ての主メソッドを呼び出すか、それとも最も近い主メソッドだけを実行するかを選択することもできる。
CLOS は多重継承を許している。多重継承でメソッドが実行されるデフォルトの順序が正しくない場合、菱形継承問題をメソッドの組み合わせを指定することで解決できる。
CLOS は動的であり、オブジェクトの内容だけでなく「構造」を実行時に変更できる。CLOS は実行時に(既にそのクラスがインスタンスを持っていても)クラス定義を変更でき、インスタンスが属するクラスを change-class
で変更できる。
CLOS はプロトタイプベースではない。インスタンスをあるクラスのメンバーとして作成するには事前にそのクラスを定義しなければならない。
ANSI 標準の範囲外だが、CLOS の実装に広く採用されている拡張としてメタオブジェクトプロトコル(MOP)がある。MOP は CLOS 実装基盤に標準インタフェースを定義し、クラスをメタクラスのインスタンスとして扱い、新たなメタクラスを定義したり、基底クラスの振る舞いを修正したりできる。CLOS MOP はアスペクト指向プログラミングの先取りとも言え、実際同じ技術者(Gregor Kiczales など)が関わっている。
参考文献
- "CommonLoops: merging Lisp and object-oriented programming", by Daniel G. Bobrow, Kenneth Kahn, Gregor Kiczales, Larry Masinter, Mark Stefik, Frank Zdybel. 1986, Portland, Oregon, United States. Pages 17 - 29 of the Conference on Object Oriented Programming Systems Languages and Applications, ISSN 0362-1340.
- "A History and Description of CLOS", by Jim Veitch. Pages 107-158 of Handbook of Programming Languages, Volume IV: Functional and Logic Programming Languages, ed. Peter H. Salus. 1998 (1st edition), Macmillian Technical Publishing; ISBN 1-57870-011-6
- Gregor Kiczales, Jim des Rivieres, and Daniel G. Bobrow, The Art of the Metaobject Protocol, 1991, MIT Press. ISBN 0-262-61074-4
- Sonya Keene, Object-Oriented Programming in Common Lisp: A Programmer's Guide to CLOS, 1988, Addison-Wesley. ISBN 0-201-17589-4.
脚注
- ^ 「CLOS は標準規格である。複数のベンダーがCLOSを提供している。CLOS やその一部は他のLISP系言語である EuLisp や EmacsLisp にオブジェクト指向を導入するのに使われている」 p. 110 (Veitch 1998)
- ^ p. 108 (Veitch 1998)
外部リンク
- The Common Lisp Object System: An Overview by Richard P. Gabriel and Linda DeMichiel
- Common Lisp HyperSpec, Chapter 7: Objects