R6RS:翻訳:R6RS:9.2 Macros
9.2 マクロ
ライブラリやトップレベルプログラムでは構文抽象やマクロと呼ばれる新しい種類の派生式を定義し、使うことができる。構文抽象はキーワードをマクロ変換子(あるいは単に変換子)に束縛することで作られる。変換子はマクロの使用が、どのように原始的なフォームに転写されるかを決定するものである。
ほとんどのマクロの使用は次のような形式をしている。
(<keyword> <datum> ...)
ここで <keyword> はフォームの種類を一意に定める識別子である。この識別子はマクロの構文キーワード(あるいは単にキーワード)と呼ばれる。 <datum> の個数と個々の構文は構文抽象によって異なる。
マクロの使用は非真正リストや単一の識別子、 set! 形式(set! の 2 番目の下位フォームがキーワードになる―― R6RS:翻訳:R6RS:11.19 Macro transformers と R6RS:翻訳:Standard Libraries:12.3 Transformers の make-variable-transformer を参照)の形を取ることもできる。
(<keyword> <datum> ... . <datum>) <keyword> (set! <keyword> <datum>)
R6RS:翻訳:R6RS:11.2 Definitions と R6RS:翻訳:R6RS:11.18 Binding constructs for syntactic keywords で述べられている、 define-syntax、 let-syntax、 letrec-syntax 形式では、キーワードへの束縛を作り、そこにマクロ変換子を対応づけ、それが可視になる有効範囲を制御する。
# R6RS:翻訳:R6RS:11.19 Macro transformers? で述べる syntax-rules と identifier-syntax はパターン言語から変換子を作成する。さらに、 R6RS:翻訳:Standard Libraries:12 syntax-case で述べられている syntax-case では任意の Scheme コードから変換子を作成することができる。
キーワードの名前空間は変数と同一である。したがって、同一のスコープでは、ある識別子は変数かキーワードとして束縛されているか、そのどちらでもないかであり、両方であることはなく、一方の局所束縛がもう一方の束縛を隠蔽することもある。
syntax-rules と identifier-syntax を使って定義したマクロは「健全」で「参照透過」であり、従って、Scheme の字句的有効範囲を保存する [16, 15, 2, 6, 9]。
- マクロ変換子がマクロの使用に出現しない(変数またはキーワードの)識別子への束縛を挿入した場合、その識別子はその有効範囲内で他の識別子と衝突しないように事実上名前を変更される。
- マクロ変換子が識別子への自由参照を挿入した場合、その参照は変換子が規定された場所で可視な束縛を参照し、マクロの使用のまわりに現れる局所束縛にはかかわらない。
syntax-case を使ったマクロも datum->syntax (R6RS:翻訳:Standard Libraries:12.6 Syntax-object and datum conversions 参照)を使わなければ参照透過である。