Let's write β

プログラミング中にできたことか、思ったこととか

ArityでDispatchしつつ、型でも適切に判断されるようなDispatchをおこなうには

僕はまえからCLOSのメソッドの定義では同名のメソッドでは同じarityの物しか許容されていないという事が面倒だなとおもっていたのですが、ようはarityが違う物ならば違う名称をわりふってやり、よびだし側にそれがわからないようにすれば解決する話しなのです。
そこで、ちょっとしたスケッチコードとして以下のような物を書いてみました。

(defun mkstr (&rest args)
  (with-output-to-string (s)
    (dolist (a args)(princ a s))))

(defun symb (&rest args)
  (values (intern (apply #'mkstr args))))

(defmacro defamethod (base-name args &body body)
  `(defmethod ,(symb base-name "-" (length args)) ,args
     ,@body))

(defmacro call-amethod (base-name &rest args)
  `(,(symb base-name "-" (length args)) ,@args))

defamethodというマクロで引数の名称にあわせた
base-name-1 base-name-2 base-name-3...
といった名称のメソッドが内部で自動定義されて、
call-amethodの呼びだしの時に適切な名称のメソッド呼びだしに展開されます。
まだスケッチの段階なので&optionalや&keyなどのあつかいには対応していませんが、
そういった物をメソッドにわたさない場面ならば十分に利用できるような状態になっています。
あとはcall-amethodを自動的によんでくれるリードマクロかなにかを記述すれば良いのかもしれません