2011/11/18

CLOS の引数の数が違うメソッド

CLOS だと (defmethod bar ()) (defmethod bar (x)) のように引数の数が違うメソッドを定義することができない。

でも、こんなふうにすれば、できなくもない。 &key とか &optional とかは考慮してない。

(defmacro dm (name args &body body)
`(progn
(unless (fboundp ',name)
(defun ,name (&rest args)
(apply (intern (format nil ,(format nil "~a/~~d" name) (length args)))
args)))
(defmethod ,(intern (format nil "~a/~d" name (length args))) ,args
,@body)))

(dm foo ((a string))
(length a))

(dm foo ((n number))
(* n n n))

(dm foo ()
"empty")

(dm foo (a b c)
(list a b c))

(list
(foo "abc")
(foo 3)
(foo)
(foo 1 2 3))
;;=> (3 27 "empty" (1 2 3))

0 件のコメント: