やっと分かった

ずっと

(define-macro (my-when test . body)
  `(if ,test (begin . ,body)))

が理解できなかった。具体的に言うと、

(my-when (even? 4) 1 2 3 4)

って使うと、,testが#tになると思い込んでいたので、,bodyが(1 2 3 4 5)という関数適用でエラーにならないことがずっと理解できなかった。
そこで、

gosh> (macroexpand '(my-when (even? 4) 1 2 3 4))
(if (even? 4) (begin 1 2 3 4))

ってやってみて、やっと気づいた。

  • ,testは#tではなく、(even? 4)というリストへ展開される
  • ,bodyは関数適用でなく(1 2 3 4)というリストへ展開される

わけだな。
メタプログラミング脳になりきれていない証拠だなー。