2008-10-15
lisp2で、functionがうざい問題
一定周期で耳にするCLの#'がうざい問題ですが、今日のチャットでも話題になったので、また色々考えてみました。
前のネタとしては、symbol-valueに、symbol-functionの値をグローバルにセットしてしまえば、#'を書く手間だけは省けるだろうというものでしたが、
そういえば、lisp1という、CLをlisp1的に書く試みがどっかにあったなと思い出したので、探して試してみました。
ちょっと試してみたのですが、ネタ的には、やはり、symbol-functionの値をsymbol-valueにセットするというのが骨子なようです(笑)
ついでにローカルな感じでlisp1的に書けるwith-lisp1ってのを考えてみました。ちなみに局所関数には対応してません。
(import 'kmrcl:flatten)
(defmacro with-lisp1 (&body body)
(let ((syms (remove-if-not (lambda (x)
(and (symbolp x)
(fboundp x)
(not (eq 'quote x))))
(flatten body))))
`(let ,(mapcar (lambda (x) `(,x (symbol-function ',x))) syms)
(declare (ignorable ,@syms))
,@body)))
;; 動作
(with-lisp1
(mapcar 1+ '(1 2 3 4)))
;=> (2 3 4 5)
(with-lisp1
(sort (list 38 29 3 1) <))
;=> (1 3 29 38)
■