7.1.2. 初期化引数の有効性の宣言
初期化引数は、4つの状況にて有効性がチェックされます。 初期化引数はひとつの状況では有効かもしれませんが、 他はそうではないかもしれません。 例えば、システムで提供されたmake-instance
のメソッドの standard-class
クラスを対象とした場合を考えます。 もし初期化引数が与えられていたものの、 有効性としての宣言がされていなかった場合、 メソッドは初期化引数の有効性チェックにおいて エラーのシグナルを発することになります。
初期化引数の有効性の宣言は、次の2つの意味があります。
スロットを設定するときの初期化引数は、 defclass
のスロットオプションである :initarg
によって有効であるとして宣言されます。 スロットオプションの:initarg
は、スーパークラスから継承されます。 よって、クラスのスロット設定時の有効な初期化引数の集合は、 クラスとスーパークラスによって有効であると宣言されたスロット設定時の 初期化引数の和集合となります。 初期化引数による値の設定は、4つの状況すべてにおいて有効です。
メソッドの引数として与えられた初期化引数は、 これらメソッドの宣言によって有効であると定義されます。 メソッドのラムダリストとして定義されたキーワードパラメーターのキーワード名は、 全てのクラスの適用可能なメソッドの初期化引数となります。 適用されるメソッドのラムダリストにある&allow-other-keys
の存在は、 初期化引数の有効性のチェックを無効にします。 よってメソッドの継承は、メソッドに引数として渡される有効な 初期化引数の集合を制御します。 メソッドの定義を持ったジェネリック関数は、下記に示すものとして、 有効な初期化引数の宣言を守ります。
関数allocate-instance
, initialize-instance
とshared-initialize
により、 クラスのインスタンスを作成するとき。 クラスのインスタンスを作成するとき、 これらのメソッドにより有効だと宣言された初期化引数は有効です。
関数reinitialize-instance
と shared-initialize
により、インスタンスの再初期化が行われるとき。 インスタンスの再初期化が行われるとき、 これらのメソッドにより有効だと宣言された初期化引数は有効です。
関数update-instance-for-redefined-class
と shared-initialize
により、 再定義されたクラスにインスタンスを更新するとき。 再定義されたクラスにインスタンスを更新するとき、 これらのメソッドにより有効だと宣言された初期化引数は有効です。
関数update-instance-for-different-class
と shared-initialize
により、 違うクラスの定義にインスタンスを更新するとき。 違うクラスの定義にインスタンスを更新するとき、 これらのメソッドにより有効だと宣言された初期化引数は有効です。
クラスの有効な初期化引数の集合は、スロットの値の設定か、 あるいは初期化引数の前宣言として与えられる:allow-other-keys
に従った メソッドの引数かのどちらかの初期化引数の集合です。 :allow-other-keys
のデフォルト値はnil
です。 もし初期化引数:allow-other-keys
の値がtrue
であるならば、 初期化引数の有効性の確認は無効となります。