これらはerrorとerrorf (例外の通知参照) と
ほぼ同じですが、実行時ではなくマクロ展開時(すなわち、コンパイル時)に
エラーを通知するところが異なります。
これらの手続きは、マクロの誤った使い方を、
マクロ展開ルーチンの出す複雑なエラーではなく、
分かりやすい方法でユーザーに通知するのに使えます。
そのため、arg …はunwrap-syntaxに渡されて
内部の構文的束縛情報を取り除いた後でこれらの手続きに渡されます (識別子参照)。
(define-syntax my-macro
(syntax-rules ()
((_ a b) (foo2 a b))
((_ a b c) (foo3 a b c))
((_ . ?)
(syntax-error "malformed my-macro" (my-macro . ?)))))
(my-macro 1 2 3 4)
⇒ error: "malformed my-macro: (my-macro 1 2 3 4)"
註: ERマクロ展開器中でマクロの謝った使い方を通知するには、
普通のerror手続きが使えます。
マクロ展開器の式はマクロ展開中に評価されるので、
エラーもその時に投げられるからです。
syntax-rulesでsyntax-errorが必要なのは、
syntax-errorフォームはマクロ展開時には展開結果に挿入されるだけで、
それが評価されるのは実行時になるからです。