7.5.1. スロットの紹介

UP


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. スロットの継承とスロットオプションを参照。


TOP, Github