昨日のマクロ
謎が解けた。というか会社の人に教えてもらった。
(defmacro when* (test &rest body) (if test `(progn ,@body)))
こんな感じのが昨日のマクロ。
これの何が悪かったのかというと、test がフォームのまま評価されていたということ。つまり
(when* (equal 1 2) 1)
は
(if '(equal 1 2) (progn 1))
てな感じに展開される。'(equal 1 2) は非 nil なので、(progn 1) が結果として生成されるっていう感じかなぁ。
解決策はというと、eval しちゃえばいいというものだった。
(defmacro when* (test &rest body) (if (eval test) `(progn ,@body)))
eval って普段使ってる言語ではまず出てこないから、存在を忘れてた。