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
というクラスを除く すべてのクラスと疎の関係であることが保証されます。