2008/07/07

[Common Lisp] lambda と書くのがめんどうなときに。ちょっと考えなおした。

#_(* 2 _a) より (_ * 2 _a) でいいか。(_ (declare (optimize (speed 3))) (_ * 2 _a)) こっちは自然だな。いっそのこと [* 2 _a] とも思う(Arc!)が () に [] がまざるのに強烈な違和感を感じる(慣れるかな?)。(_ * 2 _) これでもいける。

(defmacro _ (&rest body)
(let ((syms
(sort
(remove-duplicates
(remove-if-not (lambda (x)
(and (symbolp x)
(head-p (symbol-name x) "_")))
(flatten body)))
#'string<=
:key #'symbol-name)))
(let ((rest (find '_rest syms :key #'symbol-name :test #'string=)))
(when rest
(setq syms (append (remove rest syms) `(&rest ,rest)))))
(if (consp (car body))
`(lambda ,syms
,@body)
`(lambda ,syms
,body))))

0 件のコメント: