syntax-rules
うう…まだ semantics で誤解してたところが出てくる…
[11/06 より]
Template 内で束縛された識別子は隠される。それだけだと置換後にも verbatim で残る識別子を template 内に書くことができない (else とか => とか) ので、syntax-rules form の始めので、置換・自由変数解決の対象から除く識別子を指定することができる。
[12/11 より]
を使ってわざと hygienicity を回避した code が動かん
したがって
内に symbol s を置きたい; - s に wildcard 兼 parameter として働いてもらっては困る (=> とか、ただしそれは caller の側でいつでもその symbol を新たに束縛することで override できる) かつ
- 内で s を、まるで pattern variable でも literal identifier でもない symbol のように、即ち macro の定義環境で解決される変数の指定子として使いたい
場合に使う。
という事で "lexically scoped" という principle の paranoi度 を見くびってました。何がどうあっても、与えられた symbol の semantics は source file 上の見掛けの包含関係だけで解決できる。追記: ただし展開の最中に束縛式 (lambda の仮引数列とか) に放りこまれた場合、出自に関する情報は剥がされて、rename される。同じ出自情報を持つもので、束縛の有効範囲内にあるものも rename 後のものに置き換えられる。その束縛式がさらに submacro の template にあたる場合、submacro の展開では「source file 上の見掛け」ではなくて「一段展開した後の source file での見掛け」が lexically scoped。
追記: ところで Gauche って "An Advanced Syntax-Rules Primer for the Mildly Insane" のこの例で 2 を返す。これはバグと呼んでいいのかしら。
gosh> (let ((x 1)) (let-syntax ((foo (syntax-rules () ((_ y) (let-syntax ((bar (syntax-rules () ((_) (let ((x 2)) y))))) (bar)))))) (foo x))) 2