Posted 2009-02-09 06:20:00 GMT
最近は専らClozure CLばかり使っているのですが、ふとしたきっかけから
(declaim (ignore ignore))が動くことを知りました。
(let ((foo '(a b c d e f g))) (mapcar (lambda (ignore) (gensym)) foo))などでもLAMBDAのところにdeclareを入れなくて済むのでイイ! などと思っていたのですが、SBCLにしたら普通に警告がでたので、HyperSpecで調べたら、どうもdeclaim/proclaimでignoreが使えるのは、Clozure CLの拡張のようです。
(defmacro iglambda ((&rest bvl-spec) &body body) (let ((ignores (remove-if #'symbol-package bvl-spec))) `(lambda ,bvl-spec (declare (ignore ,@ignores)) ,@body)))
(let ((foo '(a b c d e f g))) (mapcar (iglambda (#:ignore #:ignore) (gensym)) foo foo)) ;=> (G2742 G2743 G2744 G2745 G2746 G2747 G2748)■(funcall (iglambda (#:x) (print "foo")) 33) ;-> "foo" ;=> "foo"