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 件のコメント:
コメントを投稿