前方参照するマクロを自分好みに

it などの特定の変数を暗黙のうちに用意して前方参照できるようにする、いわゆるアナフォリック・マクロ。あれがちょっと好みでないので、変数名を自分で指定する変種を作ってみた。
lif は有名な aif の変数指定版。テスト・フォームの前に変数名を置くだけ。
pipe はアナフォリックな progn という感じ。トップレベルでは最後に「外に落ちた」値が * で参照できるが、これは第1引数に取った変数名で同じことをやる。毎回 setq するのは面白くないので reduce で let を連鎖させてみた。
alis は上記の pipe に似ているが、外に落ちた値をすべて集めてリストにする。それから変数の初期値を指定できるようになっている。


コード:

(defmacro lif (var test-form then-form &optional else-form)
  `(let ((,var ,test-form))
     (if ,var ,then-form ,else-form)))

(defmacro pipe (var &body body)
  (reduce #'(lambda (prev-body new-expr)
              `(let ((,var ,prev-body))
                 ,new-expr))
          body))

(defmacro alis (var-form &rest exprs)
  (let ((var (if (symbolp var-form) var-form (car var-form))))
    `(let (,var-form)
       (list ,@(mapcar #'(lambda (expr) `(setq ,var ,expr))
                       exprs)))))


使用例:

CL-USER> (pipe it
           '(a b c)
           (cdr it)
           (cdr it))
(C)
CL-USER> (alis it
               '(a b c)
               (cdr it)
               (cdr it))
((A B C) (B C) (C))
CL-USER> (alis (it '(a b c))
               (cdr it)
               (cdr it))
((B C) (C))