さくらんぼのlambda日記

lambdaちっくなことからゲーム開発までいろいろ書きます。

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)

なんと。実行できてしまいました。

どうしてだろう...。