npt-japanese

% 7.1.7. Make-InstanceとInitialize-Instanceの宣言

UP


7.1.7. Make-InstanceとInitialize-Instanceの宣言

ジェネリック関数make-instanceは、最適化を考えない場合は、 下記に示す宣言のように実行されます。

(defmethod make-instance ((class standard-class) &rest initargs)
  ...
  (let ((instance (apply #'allocate-instance class initargs)))
    (apply #'initialize-instance instance initargs)
    instance))

(defmethod make-instance ((class-name symbol) &rest initargs)
  (apply #'make-instance (find-class class-name) initargs))

make-instanceの定義で省かれているコードは、 initargsをデフォルト初期化引数によって指定する部分であり、 また初期化引数の結果を 初期化引数に設定するかどうか決定するために、 スロットに値が設定されておらず、 メソッドの引数として供給もされていないかどうかをチェックする部分となります。

ジェネリック関数initialize-instanceは、最適化を考えない場合は、 下記に示す宣言のように実行されます。

(defmethod initialize-instance ((instance standard-object) &rest initargs)
  (apply #'shared-initialize instance t initargs))

これらのコードはカスタマイズ可能です。

プログラマーへのインターフェイスレベルとしてカスタマイズできるものは、 defclassのオプションである、:initform, :initarg, そして:default-initargsが含まれますし、 同様にmake-instance, allocate-instance, そしてinitialize-instanceのメソッド宣言があげられます。 shared-initializeのメソッドを定義することも可能です。 この関数は、ジェネリック関数のreinitialize-instance, update-instance-for-redefined-class, update-instance-for-different-class, そしてinitialize-instanceによって実行されます。 メタオブジェクトレベルでは、追加でカスタマイズをサポートします。

処理系は、initialize-instanceshared-initializeについて 明確な最適化を許容しています。 7章にあるshared-initializeの定義では、可能な最適化についての説明があります。


TOP, Github