util.identifier-syntax
- R6RS識別子マクロ ¶R6RSのidentifier-syntax
フォームを提供します。
set!
id2 pattern) template2) ¶[R6RS]
{util.identifier-syntax
}
R6RSで規定されている方法で識別子マクロ変換器を作ります。
識別子マクロについては識別子マクロ変換器を参照してください。
このマクロはmake-id-transformer
を使って作られています。
R6RSコードをGaucheにポートする際に便利でしょう。
このフォームはマクロ定義のtransformer-specとして使うことができます (衛生的マクロ参照)。それ以外の部分に現れた場合の動作は未定義です。
最初の形式は、識別子マクロをtemplateへと展開します。 例えば次の定義があったとします:
(define-syntax now (identifier-syntax (sys-time)))
すると、now
が現れたらそれは全て(sys-time)
へと展開されます。
ただし(set! now expr)
はエラーになります。
二番目の形式はset!
に使われた場合の展開も定義します。
次はちょっとわざとらしい例ですが:
(define-syntax foo (identifier-syntax [_ (get-foo)] [(set! _ expr) (set-foo! expr)]))
foo
が出現するとそれは(get-foo)
に置き換えられます。
ただし(set! foo something)
の場合はそれが
(set-foo! something)
となります。
(make-id-transformer
とsyntax-rules
の組み合わせとは違って、
set!
とマッチする節を後に置きます。)
展開は衛生的です。templateに現れる識別子はidentifier-syntax
が現れた
環境での意味を捕捉し、マクロが使われる環境に影響されません。