素朴な疑問なのですが、CommonLispでdefmethodするにあたって、meta-classレベルでdispatchできるのでしょうか?
http://coding.derkeiler.com/Archive/Lisp/comp.lang.lisp/2007-06/msg01042.html
ここを見るかぎり、できないとの回答でした。
しかし、Postmodernなど、metaclassを提供しているライブラリもあり、そんなライブラリから自分のクラスを拡張しているとmetaclassレベルでディスパッチしたい事もあります。
たとえば、PostmodernはDBにStoreできるクラスのためのメタクラスとしてdao-classというメタクラスを提供しているのですが、このdao-classをmetaclassとするクラスにたいする共通のテンプレートメソッドのようなものを定義したいときがあります。
まぁ自分のためのツールなら、自分で気をつければ済む話なのではありますが、ほしい機構ではあります。
ちなみに、dao-classをmetaclassとするクラスに提供されているdao-classにはsave-dao等の共通機能があります。
そちらは
(defun save-dao (dao) "Try to insert the content of a DAO. If this leads to a unique key violation, update it instead." (handler-case (progn (insert-dao dao) t) (cl-postgres-error:unique-violation () (update-dao dao) nil)))
となっています。なんらdispatchしてないので、当然普通のインスタンスにたいしても、呼べはします。(insert-daoが未定義といって落ちますが)
そこで、insert-daoを見てみると
(defun build-dao-methods (class) ..... (defmethod insert-dao ((object ,class)) (let (bound unbound) .... )
となっています。つまり、直接クラスにメソッドをインストールしているようなのです。
何か良いほうほうはないでしょうか、コメントおまちしています。