% Standard-Generic-Function SHARED-INITIALIZE
Standard Generic Function SHARED-INITIALIZE
shared-initialize instance slot-names
&rest initargs &key &allow-other-keys
=> instance
shared-initialize (instance standard-object) slot-names &rest initargs
instance - オブジェクト
slot-names - リストかt
initargs - keyword/valueのペアのリスト(初期化引数の名前と値)
ジェネリック関数shared-initializeはインスタンスのスロットに、
引数initargsと:initformを用いて値を埋めるときに使われます。
この関数の呼び出しは、インスタンスが作成されるとき、
インスタンスが再初期化されるとき、
クラスの再定義によりインスタンスが更新されるとき、
違うクラスにインスタンスを従わせるときに行われます。
ジェネリック関数shared-initializeは、
システムにより共有されるメソッドである、
initialize-instance, reinitialize-instance,
update-instance-for-redefined-class,
そしてupdate-instance-for-different-classによって呼び出されます。
ジェネリック関数shared-initializeは、次のような引数を取ります。
初期化されるインスタンス、
インスタンスがアクセス可能なスロットの名前の集合、
そしてinitargsの集合です。
最初2つの引数のあとの引数は、
初期化引数リストの形を取らなければなりません。
システムが提供しているshared-initializeのメソッドは、
スロットの値をinitargsで指定された:initformのフォームによって初期化します。
slot-namesは、もしスロットに対してinitargsが指定されていなかった場合、
:initformによって初期化するべきスロットを指定します。
スロットがローカルか共有かにかかわらず、システムが共有するメソッドは、 下記のような振る舞いをします。
もしスロットに対して、 初期化引数リストにあるinitargが値を特定している場合、 値はそのスロットに格納されます。 もしそのスロットにはすでに値が格納されている場合でも同様に、値が格納されます。 値の格納は、メソッドが実行する前に行われます。
slot-namesで指定されたどんなスロットでも、
現時点においてまだunboundであった場合は、
:initformフォームによって初期化されます。
:initformフォームを持ったどんなスロットでも、
フォーム自体はdefclassフォームが宣言されたレキシカル環境によって評価され、
結果がスロットへ格納されます。
例えば、beforeメソッドがスロットに値を格納した場合は、
:initformフォームはスロットへの値の供給には使用されないでしょう。
規則7.1.4. 初期化引数の規則に従います。
もし初期化引数が指定されなかった場合、
slot-names引数によって指定されたスロットは
:initformフォームに従って初期化されます。
slot-namesはスロットの名前のリストにすることができます。
この場合は、スロットの名前の集合を指定することになります。
あるいは、slot-namesにシンボルであるtを指定することもできます。
この場合は、スロットのすべての集合を指定したことになります。
なし。
なし。
なし。
initialize-instance,
reinitialize-instance,
update-instance-for-redefined-class,
update-instance-for-different-class,
slot-boundp,
slot-makunbound,
7.1. オブジェクトの作成と初期化,
7.1.4. 初期化引数の規則,
7.1.2. 初期化引数の有効性の宣言
initargは、defclassの:initargオプションを使用するか、
あるいはshared-initializeのメソッドを定義することで、
有効な宣言であるとされます。
shared-initializeで定義されたメソッドのラムダリスト内の
各キーワードパラメータ指定子のキーワード名は、
そのメソッドが適用される全てのクラスで有効なinitargの名前として宣言されます。
処理系は、:initformのフォームを、
副作用を生成せず依存もせず、
またinitialize-instanceのプライマリメソッドで処理するのではなく、
initialize-instanceメソッドを実行する前に、
これらのフォームを評価してスロットに値を格納することが、
最適化では許可されています。
(この最適化は、allocate-instanceメソッドに
プロトタイプのインスタンスをコピーさせることで実現できるかもしれません。)
処理系は、初期化引数リストが渡されるメソッドが
全てstandard-object上のメソッドのみである場合において、
実際には完全な初期化引数リストを作成せず、
initargsとスロットを関連付けるよう、
デフォルト初期値フォームを最適化することが許可されています。
この場合、デフォルトの初期値フォームは、
:initformフォームのように扱うことができます。
この最適化には、パフォーマンスの向上以外に目に見える効果はありません。