R6RS:翻訳:R6RS:9.2 Macros

R6RS:翻訳:R6RS:9.2 Macros

9.2 マクロ

ライブラリやトップレベルプログラムでは構文抽象マクロと呼ばれる新しい種類の派生式を定義し、使うことができる。構文抽象はキーワードをマクロ変換子(あるいは単に変換子)に束縛することで作られる。変換子はマクロの使用が、どのように原始的なフォームに転写されるかを決定するものである。

ほとんどのマクロの使用は次のような形式をしている。

(<keyword> <datum> ...)

ここで <keyword> はフォームの種類を一意に定める識別子である。この識別子はマクロの構文キーワード(あるいは単にキーワード)と呼ばれる。 <datum> の個数と個々の構文は構文抽象によって異なる。

マクロの使用は非真正リストや単一の識別子、 set! 形式(set! の 2 番目の下位フォームがキーワードになる―― R6RS:翻訳:R6RS:11.19 Macro transformersR6RS:翻訳:Standard Libraries:12.3 Transformers の make-variable-transformer を参照)の形を取ることもできる。

(<keyword> <datum> ... . <datum>)
<keyword>
(set! <keyword> <datum>)

R6RS:翻訳:R6RS:11.2 DefinitionsR6RS:翻訳: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 参照)を使わなければ参照透過である。


Last modified : 2008/03/20 14:34:02 UTC