Common Lisp Object System
CLOSでは、上のソートによって作られたメソッドのリストに一定の戦略を適用することで、最終的に実際に行う動作を決定する。この戦略のことをメソッド結合と呼ぶ。いくつかのバリエーションが標準で定義されている。
他の言語において、あるインスタンスのメソッドを呼び出すときの動作について考えてみよう。そのインスタンスのクラスが親クラスを持つとき、例えばJavaのような言語においては、継承されたメソッドは上書きされてしまう。一方,CLOSではそのような通常の上書き(オーバーライド)戦略だけにとどまらず、多種多様な戦略がANSI標準で定義され、かつ自由に定義できる。 (ただし、javaはsuperという特殊なメソッドを備えているため、子クラスのメソッドから親のメソッドを呼ぶことができ、言語の柔軟性を高めている。)
メソッド結合法則は総称関数の定義ごとに指定する。標準メソッド結合以外のメソッド結合法則を指定した場合、メソッド定義の際にはメソッド指定子(Qualifier)を指定して、結合法則に固有の機能を使うことを指定しなくてはいけない。それぞれのメソッド結合は複数のメソッド指定子を持つ。なお、すべてのメソッド結合は:aroundメソッド結合を持たなくてはならないと定義されている。
CLOS は多重ディスパッチシステムである。すなわち、引数のデータ型によってメソッドを用意できる。多くのオブジェクト指向言語は単一ディスパッチであり、メソッドは第一引数のデータ型でしかディスパッチできない。CLOS のメソッドは総称関数にグループ化される。総称関数は同じ名前と引数構造を持つ(ただし個々の引数のデータ型が異なる)メソッドを集めたものである。後の例によりこのことをより良く説明する。
Common Lisp Object System(コモン リスプ オブジェクトシステム、略称 CLOS)は、ANSI Common Lisp (CL) の一部をなすオブジェクト指向プログラミング機能であり、他の言語(EuLisp や Emacs Lisp、Scheme、Dylan)にも類似のシステムが導入されている。1984年のCommon Lisp仕様ではオブジェクト指向システムは時期尚早として組み込まれなかったが、1994年のANSI標準では組み込み機能となった。CLOS は強い型付けをもつ動的(実行時に定義を変更できる)オブジェクトシステムであり、C++やJavaのような静的なオブジェクト指向言語とは大きく異なる。1970年代に始まる初期のLISPオブジェクトシステム(MIT Flavors や LOOPS)に影響されているが、より汎用的である。
LISPにオブジェクト指向を導入することは簡単である。2ページ程度のコードがあれば実現できる(Graham, 1994)。一方、オブジェクト指向LISPを柔軟で拡張性に富んだものに設計するのはより困難であった。CLOS は完全なオブジェクトシステムであり、オブジェクト指向システム自体がオブジェクト指向プログラミングによって拡張可能である。拡張のプロトコルは CLOS Metaobject Protocol (MOP) と呼ばれる。
多くの動的オブジェクト指向言語(Pythonなど)と同様、CLOS ではカプセル化が行われない。任意のデータ(スロット)にslot-value 関数でアクセス可能である。
データ構造や関数管理にあたって、CL のプログラマはパッケージというモジュール管理機能を用いることが多い。