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を記述することができます。