ずっと
(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)というリストへ展開される
わけだな。
メタプログラミング脳になりきれていない証拠だなー。