スペシャル関数を作ってみた
昨日言っていたスペシャル関数を実際に作ってみました。
(defmacro desun (name args &body body) (let ((a (gensym))) `(progn (defparameter ,name #'(lambda ,args ,@body)) (defun ,name (&rest ,a) (apply ,name ,a))))) (defmacro slet (l-list &body body) `(let ,(mapcar #'(lambda (x) `(,(car x) #'(lambda ,(cadr x) ,@(cddr x)))) l-list) ,@body))
まずは、スペシャル関数を作る、desun(define special function)と、
fletのスペシャル関数版であるsletを作ります。
(desun =hoge= (n) (when (> n 0) (print n) (=hoge= (1- n)))) (defun foo (n) (=hoge= n))
スペシャル関数=hoge=と、普通の関数fooを作ります。
関数と変数の両方の名前空間を使うのは少々かっこ悪いですが、どうかお許し下さい。
CL-USER> (foo 3) 3 2 1 NIL CL-USER > (flet ((=hoge= (x) x)) (foo 3)) 3 2 1 NIL CL-USER > (slet ((=hoge= (x) x)) (foo 3)) 3
こりゃダイナミックだ!