昨日のマクロ

謎が解けた。というか会社の人に教えてもらった。

(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 って普段使ってる言語ではまず出てこないから、存在を忘れてた。