読者です 読者をやめる 読者になる 読者になる

Let's write β

趣味で書いたこととか、RustとLispが好き

CLでmetaclassでdispatchするdefmethodはできない?

Lisp

素朴な疑問なのですが、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)
         ....
 )

となっています。つまり、直接クラスにメソッドをインストールしているようなのです。

何か良いほうほうはないでしょうか、コメントおまちしています。

僕が働いているAzit.incでは一緒に働けるエンジニアを募集しています!
採用情報 — 株式会社アジット|Azit Inc.