CommonLispオブジェクトシステム


Common_Lisp_Object_System

その他の使用法については、Closを参照してください Common Lispのオブジェクトシステム(CLOS)のための設備であり、オブジェクト指向プログラミングの一部であるANSI Common Lispの。CLOSは強力な動的オブジェクトシステムであり、C ++やJavaなどのより静的な言語に見られるOOP機能とは根本的に異なります。CLOSは、MITフレーバーやCommonLoopsなどの初期のLispオブジェクトシステムに触発されましたが、どちらよりも一般的です。アドオンCLOSは、Common LispのためのANSI規格の一部として採用されたとのような他のLisp方言に適合されているように、本来提案EuLispまたはEmacs Lispに。
ANSI CommonLispでの標準的なメソッドの組み合わせ

コンテンツ
1 特徴
2 メタオブジェクトプロトコル
3 古いLispベースのオブジェクトシステムからの影響
4 他のプログラミング言語のCLOS
5 参考文献
6 参考文献
7 文学

特徴
CLOSの基本的な構成要素は、メソッド、クラス、それらのクラスのインスタンス、およびジェネリック関数です。CLOSはそれらを定義するためのマクロを提供しますdefclass、defmethodとdefgeneric。インスタンスはメソッドで作成されmake-instanceます。
クラスには、複数のスーパークラス、スロットのリスト(C ++ / Java用語ではメンバー変数)、および特別なメタクラスを含めることができます。スロットは、クラス(クラスのすべてのインスタンスがスロットを共有する)またはインスタンスごとに割り当てることができます。各スロットには名前があり、関数を使用してその名前でスロットの値にアクセスできますslot-value。さらに、スロットの値を読み書きするための特別な汎用関数を定義できます。CLOSクラスの各スロットには、一意の名前を付ける必要が
CLOSは多重ディスパッチシステムです。これは、メソッドが必要な引数のいずれかまたはすべてに特化できることを意味します。ほとんどのオブジェクト指向言語はシングルディスパッチです。つまり、メソッドは最初の引数にのみ特化しています。もう1つの珍しい機能は、メソッドがクラスに「属さない」ことです。クラスは、ジェネリック関数またはメソッドの名前空間を提供しません。メソッドはクラスとは別に定義され、クラススロットへの特別なアクセス(「this」、「self」、「protected」など)はありません。
CLOSのメソッドは、ジェネリック関数にグループ化されています。ジェネリック関数は、関数のように呼び出すことができ、メソッドのコレクションを、それぞれが異なる引数に特化した共有名と引数構造に関連付けるオブジェクトです。Common Lispは構造体と組み込みデータ型(数値、文字列、文字、記号など)に非CLOSクラスを提供するため、CLOSディスパッチはこれらの非CLOSクラスでも機能します。CLOSは、個々のオブジェクト(eqlスペシャライザー)へのディスパッチもサポートします。CLOSは、デフォルトでは、すべてのCommon Lispデータ型に対するディスパッチをサポートしていません(たとえば、ディスパッチは、完全に特殊化された配列型またはによって導入された型に対しては機能しませんdeftype)。ただし、ほとんどのCommon Lisp実装は、ジェネリック関数がアプリケーション固有の特殊化およびディスパッチルールを提供できるようにするメタオブジェクトプロトコルを提供します。
CLOSでのディスパッチも、ほとんどのOO言語とは異なります。
引数のリストが与えられると、適用可能なメソッドのリストが決定されます。
このリストは、パラメータースペシャライザーの特異性に従ってソートされています。
次に、このリストから選択されたメソッドは、ジェネリック関数で使用されるメソッドの組み合わせを使用して、効果的なメソッドに結合されます。
次に、元の引数を使用して有効なメソッドが呼び出されます。
このディスパッチメカニズムは実行時に機能します。したがって、メソッドを追加または削除すると、実行時に有効なメソッドが変更される可能性があります(ジェネリック関数が同じ引数で呼び出された場合でも)。メソッドの組み合わせを変更すると、効果的なメソッドが異なる場合も
例えば、
; 共通引数構造のプロトタイプを宣言します(defgeneric f (x y )); (f integer t)の実装を定義します。ここで、tはすべてのタイプに一致します(defmethod f ((x integer ) y ) 1 )(f 1 2.0 ) => 1; (f integer real)(defmethod f ((x integer ) (y real )) 2 )の実装を定義します(f 1 2.0 ) => 2 ; 実行時にディスパッチが変更されました
ほとんどの動的言語のオブジェクト指向システムと同様に、CLOSはカプセル化を強制しません。slot-value関数を使用するか、(オプションで自動生成された)アクセサメソッドを介して、任意のスロットにアクセスできます。経由でアクセスするにslot-valueは、スロットの名前を知っている必要がCLプログラマーは、言語のパッケージ機能を使用して、エクスポートする関数またはデータ構造を宣言します。
別に正常(「主」)の方法から、またある:before、:afterおよび:around「補助」の方法。前の2つは、クラス階層に基づいた特定の順序で、プライマリメソッドの前または後に呼び出されます。:aroundこの方法は、主要な方法が全く実行されたかどうかを制御することができます。さらに、プログラマーは、クラス階層に沿って可能なすべてのプライマリメソッドを呼び出すか、最も近いものだけを呼び出すかを指定できます。
標準法組合せは、一次、前、後及び周りの方法は、上記で説明提供します。他のメソッド-他のメソッドタイプとの組み合わせが新しい(単純なものと複雑なものの両方)メソッド-組み合わせとメソッドタイプを定義できます。
CLOSは多重継承を許可します。メソッドが多重継承で実行されるデフォルトの順序が正しくない場合、プログラマーはメソッドの組み合わせの順序を指定することでダイヤモンド継承の問題を解決できます。
CLOSは動的です。つまり、コンテンツだけでなく、そのオブジェクトの構造も実行時に変更できます。CLOSは、クラス定義をオンザフライで変更すること(問題のクラスのインスタンスがすでに存在する場合でも)、およびchange-class演算子を介して特定のインスタンスのクラスメンバーシップを変更することをサポートします。CLOSを使用すると、実行時にメソッドを追加、再定義、および削除することもできます。サークル楕円問題は容易にCLOSで解決されており、ほとんどのOOPのデザインパターンは、どちらか消えるか、質的に簡単です。
CLOSはプロトタイプ言語ではありません。オブジェクトをそのクラスのメンバーとしてインスタンス化する前に、クラスを定義する必要が

メタオブジェクトプロトコル
ANSI Common Lisp標準の外に、メタオブジェクトプロトコル(MOP)と呼ばれるCLOSへの広く実装された拡張機能がMOPは、CLOS実装の基盤への標準インターフェイスを定義し、クラス、スロット記述、総称関数、およびメソッド自体をメタクラスのインスタンスとして扱い、新しいメタクラスの定義とすべてのCLOS動作の変更を可能にします。CLOS MOPの柔軟性は、アスペクト指向プログラミングを予見します。これは、後にGregorKiczalesなどの同じエンジニアによって開発されました。MOPは、一連のプロトコルによってオブジェクトシステム全体の動作を定義します。これらはCLOSの観点から定義されています。したがって、提供されているCLOS機能を拡張または変更することにより、新しいオブジェクトシステムを作成することができます。『The Art of the Metaobject Protocol』では、CLOSMOPの使用と実装について説明しています。
さまざまなCommonLisp実装では、メタオブジェクトプロトコルのサポートがわずかに異なります。クローサープロジェクトの目的は欠けている機能を提供します。

古いLispベースのオブジェクトシステムからの影響
フレーバー(およびその後継のニューフレーバー)は、MIT LispMachineのオブジェクトシステムでした。Lisp Machineオペレーティングシステムの大部分とそのための多くのアプリケーションは、フレーバーまたは新しいフレーバーを使用します。フレーバーは、他の機能の中でも、多重継承とミックスインを導入しました。Common Lispの実装は存在しますが、フレーバーはほとんど廃止されています。フレーバーはメッセージパッシングパラダイムを使用していました。新しいフレーバーはジェネリック関数を導入しました。
CommonLoopsはLOOPSの後継でした(Xerox Interlisp -Dから)。CommonLoopsはCommonLispに実装されました。Portable CommonLoops(PCL)と呼ばれるポータブル実装は、CLOSの最初の実装でした。PCLは、広く移植、依然としていくつかのCLOSの実装のための基地提供されるのCommon Lispの実装を。PCLは、ほとんどの場合、システムに依存する部分が少ないポータブルCommonLispに実装されています。

他のプログラミング言語のCLOS
CLOSのパワーと表現度、およびTinyCLOS(Schemeで使用するためにGregor Kiczalesによって作成された簡略化されたポータブルCLOS実装)の歴史的な可用性により、CLOSのようなMOPベースのオブジェクトシステムはほとんどのLispで事実上の標準になっています方言の実装、および他のいくつかの言語のOOP機能への道を見つける:
COS、Cオブジェクトシステム
ディラン
Dynace、Cでの(主に)CLOS実装
EmacsLisp用のEIEIO
Gauche、CLOSを使用したスキーム
GOOPSでGNUガイル ISLISPのILOS Meroon、Schemeのオブジェクトシステム
いて座、CLOSのスキーム
ScmObj、Scheme用
MITスキームのSOS
STklos、CLOSを使用したスキーム
ラケットで詐欺
チキンスキームの協同組合
用VCLOSスキル
Tiny-CLOS

参考文献
「CommonLoops:Lispとオブジェクト指向プログラミングのマージ」、Daniel G. Bobrow、Kenneth Kahn、Gregor Kiczales、Larry Masinter、Mark Stefik、FrankZdybelによる。1986年、米国オレゴン州ポートランド。ページ17-29オブジェクト指向システムの言語とアプリケーションのプログラミングに関する会議、ISSN 0362から1340まで。
「CLOSの歴史と説明」、JimVeitch著。プログラミング言語ハンドブック、第IV巻:関数型および論理プログラミング言語、ed。の107〜158ページ。ピーターH.サルス。1998年(初版)、マクミランテクニカルパブリッシング; ISBN  1-57870-011-6

参考文献
^ 「CLOSは標準です。複数のベンダーがCLOSを提供しています。CLOS(またはその一部)は、EuLispやEmacsLispなどの他のLisp方言にオブジェクト指向を追加するために使用されています。」p。Veitch1998の110
^ で動的言語でのデザインパターンのスライド、ピーター・ノーヴィグは様々な教科書から取られた23個のデザインパターンのうち16は、いずれかのC ++よりもディランやCommon Lispでは、「目に見えないか、単純に」であることを彼の調査結果を提示します。
^より 近いプロジェクト:MOPに近い
^ COS、Cオブジェクトシステム
^ Cへのダイナセオブジェクト指向拡張
^ VCLOS、スキルのためのCLOS
^ GregorKiczalesによって開発されたTinyCLOS

文学
ソーニャキーン、Common Lispではオブジェクト指向プログラミング:CLOSにAプログラマーズ・ガイド、1988年、アディソン・ウェズリー。
ISBN 0-201-17589-4 
Gregor Kiczales、Jim des Rivieres、Daniel G. Bobrow、The Art of the Metaobject Protocol、1991年、MITPress。
ISBN 0-262-61074-4 
Jo A. Lawless and Molly M. Miller、Understanding CLOS: The Common Lisp Object System、1991、Digital Press、
ISBN 1-55558-064-5 
Andreas Paepcke、オブジェクト指向プログラミング:CLOSパースペクティブ、1993年、MITPress。
ISBN 0-262-16136-2 
Common Lisp Object System:Richard P.GabrielとLindaDeMichielによる概要は、ジェネリック関数を使用してクラスを定義する動機についての優れた紹介を提供します。
Nick LevineによるCLOSの基礎では、CLOSでのオブジェクト指向の概念の実装とその利用方法を段階的に説明しています。LispまたはSchemeの基本的な知識を持っている人を対象としています。
Common Lisp HyperSpec、第7章:オブジェクト
 title=
「https://en.wikipedia.org/w/index.php?title=Common_Lisp_Object_System&oldid=1056699948」
から取得”