コンテンツにスキップ

Common Lisp Object System

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。Melan (会話 | 投稿記録) による 2007年5月17日 (木) 06:09個人設定で未設定ならUTC)時点の版 (en:Common Lisp Object System(2007年4月20日 6:27:30(UTC))の翻訳)であり、現在の版とは大きく異なる場合があります。

(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

Common Lisp Object SystemCLOS)は、ANSI Common Lisp (CL) の一部をなすオブジェクト指向プログラミング機能であり、他の類似の言語(EuLispEmacsLisp)にも導入されている[1]。当初アドオンとして提案され、ANSIの標準に組み込まれた。CLOS は動的オブジェクトシステムであり、C++Javaのような静的なオブジェクト指向言語とは大きく異なる。初期のLISPオブジェクトシステム(MIT FlavorsCommon 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.

脚注

  1. ^ 「CLOS は標準規格である。複数のベンダーがCLOSを提供している。CLOS やその一部は他のLISP系言語である EuLisp や EmacsLisp にオブジェクト指向を導入するのに使われている」 p. 110 (Veitch 1998)
  2. ^ p. 108 (Veitch 1998)

外部リンク