7.5.1. スロットの紹介
standard-class
がメタクラスのオブジェクトは、 0個かそれ以上の名前の付いたスロットを持ちます。 オブジェクトのスロットは、オブジェクトのクラスによって決められます。 各スロットは、値を保有できます。 スロットの名前は、変数名として使うのに有効な構文のシンボルです。
スロットが値を持っていないときは、そのスロットはunbound
であると言われます。 もしunbound
のスロットを読み込んだ場合は、 ジェネリック関数のslot-unbound
が呼び出されます。 システムが提供するslot-unbound
のメソッドでは、 引数の特定パラメーターがt
クラスのものが提供されており、 エラーが発せられます。 もしslot-unbound
が値を返却する場合は、 第一返却値はスロットの値として、そのときに使用されるものとなります。
スロットのデフォルト値フォームは、 スロットオプション:initform
によって定義されます。 :initform
フォームに値が提供された場合は、 defclass
が評価された中のレキシカル環境にてフォームが評価されます。 defclass
が評価された中のレキシカル環境に沿った:initiform
のことを、 補足された初期化フォームと呼びます。 詳細は7.1. オブジェクトの作成と初期化を参照。
局所スロットとして定義されたスロットは、 正確に一つのインスタンスがアクセス可能です。 すなわち、唯一つのスロットが確保されます。 共有スロットとして定義されたスロットは、 クラスとそのサブクラスによって与えられる、複数のインスタンスから見ることができます。
defclass
フォームによるクラスが、スロット特定子に名前を含んでいたとき、 クラスは名前が与えられたスロットが定義されたと言います。 局所スロットの宣言では、即座にはスロットが作成されません。 なぜならクラスのインスタンスが作成されるときに、スロットが作成されるからです。 共有スロットは宣言では、即座にスロットを作成します。
defclass
のスロットオプション:allocation
は、スロットの定義時に種類を指定します。 もしスロットオプション:allocation
の値が:instance
ならば、局所スロットが作成されます。 もしスロットオプション:allocation
が:class
ならば、共有スロットが作成されます。
もしスロットがインスタンスのクラスによって定義された場合、 あるいはクラスのスーパークラスから継承された場合は、 スロットはクラスのインスタンスからアクセス可能であると言います。 インスタンスからは、せいぜい一つの名前付きスロットがアクセス可能です。 クラスによって定義された共有スロットは、 クラスのすべてのインスタンスからアクセス可能です。 スロットの継承による詳細な説明は、7.5.3. スロットの継承とスロットオプションを参照。