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