semanticsはマクロ主体での実装でしたが、今回はMOP主体でチャレンジです。defclassが周囲のレキシカル変数を取り込むので何にせよ全体はマクロでまとめる他なさそうですが、そこは諦めます。(class-let*-initfunction)compute-slotsでスロット構成を生成する際に、追加したスロットの初期化関数をまとめるまとめた関数をshared-initializeで呼ぶshared-initializeで呼ばれる関数ですが、下記のようなものを生成します。初期化されるインスタンスを引数に取り、内部では、専らstandard-instance-accessを使って読み書きします。b)))))そして、下記がMOPチャレンジ版のコードですが、大したことはしていないのに長くなりました。1)MOPにして良いことがあるのかマクロ主体の場合は、スロットアクセスが名前参照ベースなので若干非効率効率ですが、MOPを使えば、standard-instance-access等の効率の良いアクセス方法が使えるので速くできるだろうということで、今回は、standard-instance-accessの利用を軸に組み立ててみました。素のインスタンス生成〜初期化と比較して、マクロ版は、約1.8倍の時間のところをMOP版では、約1.3倍程度にまで抑えることができました。速くできそうではありますが......。Protocolの例では、compute-slotsの並び順で、standard-instance-accessのインデックスを決められる的なことが書いてあります。実際に試してみると、継承した場合、上位クラスのスロット数分だけオフセットしたり(SBCL、LispWorks)名前とスロットの値が一致しなかったり(LispWorks)で、compute-slotsで並べた順がすなわちインデックスとはならない実装があるようです。しょうがないので、結局名前からインデックスを求めるようにしましたが、私が何か勘違いをしているのか、もしくはこの仕様に準拠している処理系が少ないのか。まとめこれまでlet*風にスロットの逐次初期化を2パスで考えてみましたが、shared-initializeを差し替えてしまった方が素直なのかもしれません。そのうち試してみようかなと思います。