7.1.3. 初期化引数のデフォルト値
クラスオプションである:default-initargs
を使うことで、 初期化引数のデフォルト値フォームを提供することができます。 もしいくつかのクラスによって初期化引数が有効であると宣言された場合は、 デフォルト値フォームは違うクラスによって設定されるかもしれません。 このような場合では、:default-initargs
は 継承された初期化引数によって提供されたデフォルト値が使用されます。
オプション:default-initargs
は、 初期化引数へのデフォルト値の提供のみに使用されます。 このオプションでは、シンボルを有効な初期化引数の名前として宣言しません。 さらに、オプション:default-initargs
は、 インスタンス作成時における初期化引数の デフォルト値の提供としてのみ使用されます。
クラスオプションの引数である:default-initargs
は、 初期化引数の名前とフォームが交互に現れるリストです。 各フォームは、初期化引数に対応するデフォルト値のフォームです。 初期化引数のデフォルト値のフォームは、 make-instance
の引数に初期化引数として現れていなかった場合、 かつ、もっと特定的なクラスによってデフォルト値が定義されていなかった場合のみに、 評価されて使用されます。 デフォルト値のフォームは、defclass
フォームの レキシカル環境で評価されたものが提供され、 評価された結果は初期化引数の値として使用されます。
make-instance
に指定された初期化引数は、 デフォルトの初期化引数と結び付けられ、 デフォルト初期化引数リストを生成します。 デフォルト初期化引数は、 初期化引数の名前と値を交互にリストにしたものです。 このリストは、指定されていない初期化引数の デフォルト値を決定するものであり、 また明示的に初期化引数が指定されたものは、 デフォルト初期化引数リストのより早く表れたもののリストとします。 デフォルト初期化引数は、 クラス優先リストの順番に従ったクラスのデフォルト値に順番付されます。
:default-initargs
と:initform
では、どちらもスロットの初期化に使用されますが、 両者の間には目的に違いがあります。 クラスオプションである:default-initargs
は、ユーザーに対して、 初期化引数がスロットを初期化されているかどうか、 あるいはメソッドに渡されるかどうかを知ることなしに、 デフォルト値を与える仕組みを提供します。 もしmake-instance
を呼ぶ際に、 初期化引数を明示的に与えなかった場合はデフォルト値が使用されますが、 デフォルト値は呼び出し時に指定されたものとして呼び出されます。 対称的に、スロットオプションである:initform
は、 ユーザーがスロットのデフォルト値フォームを与えるための仕組みとして提供されます。 :initform
フォームはスロットの初期化に使用されますが、 ただmake-instance
に与えられた 初期化引数に対応するスロットとの結びつきがなかった場合、 あるいは:default-initargs
にデフォルト値の指定がなかった場合のみ、 :initform
にて初期化が行われます。
初期化引数のデフォルト値フォームの評価順序と、 :initform
フォームの評価順序は定義されてはいません。 もし評価順序が重要である場合は、 代わりにinitialize-instance
かshared-initialize
メソッドを使用してください。