GMTオブジェクトへのアクセスは、slot-valueを使わず、アクセサ経由でを心掛けようとは良くいわれますが、今回は、MOPでslot-valueを回避できないかを探る試みです。MOPには、standard-instance-accessのようなものがあるので、アクセスはstandard-instance-accessを直接使ってしまえば良かろうと思って下記のようなものを書いてみました。アクセサがstandard-instance-accessでアクセスするインデックスを保持できれば良いだけなのですが、class-slots実行以降でしかインデックスは確定しないので、アクセサが別途インデックスを保持するように拡張し、インデックス確定後にアクセサに値を格納することにしました。class))おまけに速くなるのだろうか......理屈では間接参照のslot-valueと違って直接参照のstandard-instance-accessの方が速くなる筈ですがどうでしょう。処理系もslot-valueでのアクセスの最適化はしていると思いますが......。~class))読み出し速度LispWorksだと今回の方式の方が若干速くなることもあったりなかったり。ちなみにSBCL等だと余計なことをするよりslot-valueの方が速いようです......。17000041書き込み速度LispWorksだと読み出し同様、今回の方式の方が若干速くなることもあったりなかったり。ちなみにSBCL等でも若干速くなるかも。22000041今回のまとめ明示的にstandard-instance-accessを使うようにしても、slot-value経由より遅くなることもあるようなので、もう少し詰めて対策しないと御利益はなさそうです。標準のオブジェクトへのアクセスは処理系が結構最適化しているのですが、ユーザー定義のメタクラス等の派生物は標準から外れるので処理系が用意している最適化の適用外になってしまうことも多いようです。今回は、アクセス方法でslot-valueを外す試みでしたが、インスタンス初期化まわりでもslot-valueは使われています。slot-valueを排除するのは簡単な話ではなさそう。