CLOSの同名メソッドの扱いがよく分からない...
余りそういう使い方を想定していないのだと思いますが、自分の用途では必要になったのでメモがてら。
C++だと同名のメソッドで引数が違うものを定義できます。
void funcA(int var1); void funcA(int var1 , int var2);
こんなの。
まぁ、キーワード引数とかオプション引数とか色々実現する方法はCommon Lispにはたくさんあります。
ところが、CLOSで使っている総称関数だと色々面倒な事があるみたいです。
(defclass Fuga () ()) (defclass Moge () ()) (defmethod funcA ((obj Fuga) &key hoge) (format t "hello ~a~%" hoge)) (defmethod funcA ((obj Moge) &rest arg) (format t "hello ~a~%" arg))
こういう感じでobjectの型が違うと全然受け取る形が違うとエラーになってしまうようです。
odd number of &KEY arguments [Condition of type SB-INT:SIMPLE-PROGRAM-ERROR]
と怒られてしまいます。
さっぱり分からないので色々変えて試してみました。
なんとなく定義順番を変えてみると
(defclass Fuga () ()) (defclass Moge () ()) (defmethod funcA ((obj Moge) &rest arg) (format t "hello ~a~%" arg)) (defmethod funcA ((obj Fuga) &key hoge) (format t "hello ~a~%" hoge))
実行結果
hello T hello (T)
なんと。実行できてしまいました。
どうしてだろう...。