スペシャル関数を作ってみた

昨日言っていたスペシャル関数を実際に作ってみました。

(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

こりゃダイナミックだ!

Leave a Reply