% 7.1.2. 初期化引数の有効性の宣言
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であるならば、
初期化引数の有効性の確認は無効となります。