Shammer's Philosophy

My private adversaria

macro 展開式を見易くする

pprint という関数があるようだ。pretty-print の略だと思うが、これを使用すると整形して式を出力してくれる。

(defun macro-check (&rest body)
  (pprint (macroexpand-1 body)))

が、試してみたがうまくいかない。

? (defun macro-check (&rest body)
(pprint (macroexpand-1 body)))
MACRO-CHECK
? (macro-check '(dolist (x '(0 1 2)) (princ (* x x))))

((DOLIST (X '(0 1 2)) (PRINC (* X X))))
?

なんか二重括弧で渡されているようだ。どうやら、&rest が悪さをしている様子。これを無くすとうまくいく。

? (defun macro-check (body)
(pprint (macroexpand-1 body)))
MACRO-CHECK
? (macro-check '(dolist (n '(1 2 3)) (princ (* x x))))

(DO* ((#:G7674 '(1 2 3) (CDR (THE LIST #:G7674))))
     ((NULL #:G7674))
  (LET* ((N (CAR #:G7674))) (TAGBODY (PRINC (* X X)))))
? 

&rest で渡された場合は、どうやら括弧を一つ余計につけるようだ。