7.1.5. Shared-Initialize
ジェネリック関数shared-initialize
は、 インスタンスの作成時、インスタンスの再初期化時、 クラス再定義によるインスタンス更新時、違うクラスへのインスタンス更新時において、 インスタンスのスロット値を、初期化引数か :initform
フォームによって設定する際に使用されます。 method-combinationはstandard
が使用されます。 引数は次のような順番で受け取ります。 初期化されるインスタンス、インスタンスのアクセス可能なスロット名の集合、 そして任意の長さの初期化引数です。 最初2つよりあとの引数は、初期化引数リストの形にしなければなりません。
shared-initialize
の2番目の引数は、下記のどちらかに従います。
引数はスロットの名前のリスト(空リストでも可)であり、 スロット名の集合を指定したものです。
引数はシンボルt
であり、すべてのスロットの集合を指定したものです。
システムが提供しているshared-initialize
のメソッドでは、 第一引数の特定パラメーターがstandard-object
クラスのものが存在します。 このメソッドは共有か局所かに関わらず、各スロットに対して次の振る舞いを行います。
もし初期化引数リスト中の 初期化引数がスロットへの値を特定した場合は、 メソッドが実行する前に対象のスロットにすでに値が格納されていても、 スロットへ特定した値が格納されます。 影響があるスロットは、shared-initialize
の 第二引数で指定されたスロットとは独立しています。
第二引数によって指定されたどんなスロットも、 この時点においてまだunbound
であった場合は、 :initform
フォームに従って初期化されます。 :initform
フォームを持つどのスロットも、 フォームはdefclass
宣言のレキシカル環境にて評価され、 その結果がスロットに格納されます。 例えば、before
メソッドがスロットへ値を格納する場合、 :initform
フォームはスロットへの値の格納には使用されないでしょう。 もし第二引数が指定した名前が、 インスタンスのアクセス可能なスロットに対応していなかった場合は、 結果は定義されていません。
この規則は7.1.4. 初期化引数の規則に従います。
ジェネリック関数shared-initialize
は、 システムが提供するメソッドreinitialize-instance
, update-instance-for-different-class
, update-instance-for-redefined-class
, そしてinitialize-instance
によって呼び出されます。 このようにメソッドは これらすべてのコンテキスト上で実行できるようなアクションを指定するように、 shared-initialize
を記述することができます。