4.3.7. 型とクラスの統合
オブジェクトシステムは、クラス空間と型の空間を対応付けます。 全てのクラスは正しい名前を持ち、 それは対応する同じ名前の型を持ちます。
全てのクラスの正しい名前は、有効な型指定子です。 さらに全てのクラスオブジェクトは有効な型指定子です。 したがって式(typep object class)は もしobjectのクラスがclassそれ自身であるか、 あるいはクラスのサブタイプであるときは、 trueとして評価されます。 式(subtypep class1 class2)の評価は、 もしclass1がclass2のサブタイプであるか、 あるいはそれらが同じクラスであるときは、 値trueとtrueが返却され、 それ以外のときは、値falseとtrueが返却されます。 式(type-of I)を評価するとき、 IがSという名前のクラスCのインスタンスであり、 Cがstandard-classのインスタンスのとき、 もしSがCの正しい名前であるときは 式はSを返却します。 それ以外のときは、式はCを返却します。
クラスの名前とクラスオブジェクトは型指定子なので、 それらは特殊フォームであるtheの中と、 型宣言の中で使用されます。
多くの型指定子は、全てではありませんが その型と対応する同じ正しい名前を持ったクラスが事前に宣言されています。 それらの型指定子はfigure_4-8にリストされています。 例えば型arrayは、対応するarrayという名前のクラスを持ちます。 リストにはない型指定子で、 例えば(vector double-float 100)のようなものは 対応するクラスを持ちません。 deftypeの操作は、どんなクラスも生成しません。
事前に宣言されている型指定子に対応する各クラスは、 それぞれの処理系の裁量によって 3つの方法のうちのひとつで実装することができます。 それは、standard-class, structure-class, そしてシステムクラスです。
built-in-classは 機能に制限があるか、あるいは特別な表現を持った 一般化されたインスタンスのひとつです。 defclassによってbuilt-in-classクラスの サブクラスを定義しようとしたときは、 エラーが発生します。 make-instanceを呼び出して built-in-classクラスの一般化されたインスタンスを作成しようとしたときは、 エラーが発生します。 built-in-classクラスの一般化されたインスタンスに slot-valueを呼び出したときは、 エラーが発生します。 built-in-classクラスを再定義するか、 built-in-classクラスのインスタンスのクラスを change-classによって変更しようとしたときは、 型errorのエラーが発生します。 しかし、built-in-classクラスはメソッドの特定パラメーターに使用できます。
クラスがbuilt-in-classクラスかどうかは メタクラスを確認することによって決定することができます。 standard-classはクラスstandard-classのインスタンスであり、 built-in-classはクラスbuilt-in-classのインスタンスであり、 structure-classはクラスstructure-classのインスタンスです。
defstructの:typeオプションを使用しなかったときに 生成されるそれぞれの構造体の型は、 対応するクラスを持っています。 このクラスは、クラスstructure-classの一般化されたインスタンスです。 defstructの:includeオプションは、 includeの構造体の型に対応するクラスのダイレクトサブクラスを生成します。
本仕様で定義されたクラスのインスタンスに対する 本仕様で定義された関数の動作にスロットが関与するかどうかは、 仕様でスロットが明示的に定義されている場合を除き、 実装依存です。
本仕様で定義されたクラスが、 特定の実装において本仕様で定義されていないスロットを持つ場合、 これらのスロットの名前は 本仕様で定義されたパッケージの外部シンボルであってはならず、 またCL-USERパッケージでアクセス可能であってはいけません。
多くの標準的な型指定子に対応するクラスを指定する目的は、 ユーザーがこれらの型を識別するメソッドを書くことができるようにするためです。 メソッドの選択には、 各クラスに対してクラス優先順位リストを決定できることが必要です。
型指定子間の階層的な関係は、 それらの型に対応するクラス間の関係によって反映されます。
figure_4-8は事前に宣言されている型指定子に対応された クラスの集合を示します。
Figure 4-8. 事前に宣言されている型指定子に対応したクラス
これらの各クラスの要素として指定されるクラス優先順位リストの情報は、 オブジェクトシステムで必要とされるものです。
個々の実装は、他の型指定子が対応するクラスを持つような定義で拡張できます。 個々の実装は、標準として規定された型の関係と型の疎の関係の要件に違反しない限り、 他のサブクラスの関係を追加し、 クラス優先順位リストに他の要素を追加するように拡張できます。 ダイレクトスーパークラスを持たずに定義された標準クラスは、 表中のtというクラスを除く すべてのクラスと疎の関係であることが保証されます。