GMT最近はECLOSを再現して遊んでいますが、今回は、self-referent-classというメタクラスを再現してみます。self-referent-classについては、ECLOSの論文に詳しいので参照してください。挙動を確認してみる説明はあるとはいえ、マニュアルや仕様書ではないので、実際実装してみようとすると良くわからないところはありますが、インスタンスの初期化時に他のスロットを参照できること=自己参照、ということのようです。論文の解説によれば、大体下記のような挙動になります。LispのMOPについて問題点が何点も指摘されていますが、スロット定義のinitfunctionが引数を取らないことも指摘しています。この指摘の中で、この問題を回避するためにスペシャル変数経由で渡していると書いてあるのですが、だとすると、shared-initializeの中のスロット初期化関数にスペシャル変数経由でselfを渡しているのでしょう。shared-initializeの:aroundを使ってスペシャル変数の囲いはこんな風に書けるでしょう。...)のようなものに差し替えればOKです。self)のような形式は、スロット名の局所関数を作成し、ensure-class-using-classの周りに展開されるようにすれば良さそうです。以上で、想像される展開は下記のようになります。(def:location)))))実装してみるdefclassがメタクラスに応じて任意の展開にディスパッチされると便利なのですが、LispWorksだとexpand-defclassというのがあるので、ここに展開メソッドを追加してやることでdefclassの兄弟マクロを定義せずに済みました。このexpand-defclassですが、X3J13-88-003Rにあるのと同じ大体同じインターフェイスです。ちなみに、これらはclass-prototypeをディスパッチに利用するのですが、昔からこういう使い方は或る種の定番だったようです。ベタベタにLispWorks依存になっています。,@plist)))))まとめexpand-defclassは便利なのでLispWorks限らず他でも使いたいところですが、このあたりは統一されてないんですよねえ。