For Development HEAD DRAFTSearch (procedure/syntax/module):

12.86 util.identifier-syntax - R6RS識別子マクロ

Module: util.identifier-syntax

R6RSのidentifier-syntaxフォームを提供します。

Macro: identifier-syntax template
Macro: identifier-syntax (id1 template1) ((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-transformersyntax-rulesの組み合わせとは違って、 set!とマッチする節を後に置きます。)

展開は衛生的です。templateに現れる識別子はidentifier-syntaxが現れた 環境での意味を捕捉し、マクロが使われる環境に影響されません。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT