% 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
フォームのように扱うことができます。
この最適化には、パフォーマンスの向上以外に目に見える効果はありません。