For Gauche 0.9.5


Previous: , Up: マクロ   [Contents][Index]

5.5 マクロユーティリティ

Macro: syntax-error msg arg …
Macro: syntax-errorf fmt arg …

これらはerrorerrorf (例外の通知参照) と ほぼ同じですが、実行時ではなくマクロ展開時(すなわち、コンパイル時)に エラーを通知するところが異なります。

これらの手続きは、マクロの誤った使い方を、 マクロ展開ルーチンの出す複雑なエラーではなく、 分かりやすい方法でユーザーに通知するのに使えます。 そのため、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: (mymacro 1 2 3 4)"
Function: unwrap-syntax form

formの内部的な構文情報を取り除きます。 健全なマクロの実装のために、マクロ拡張ルーチンはマクロ内のシンボルを 識別子(identifier)に置き換えます。識別子はそれが現れる構文的環境を 捕捉します。それはコンパイラに取っては必要な情報ですが、 エラーメッセージに現れるとユーザーを混乱させるもとにもなります。 そこで、この手続きではform中の識別子をもとのシンボルに 置換しなおします。


Previous: , Up: マクロ   [Contents][Index]