syntax-rulesの健全性

しばらく前にドブロブニクイスタンブルに旅行に行ってきた。イスタンブルにいたのが丁度twitterが遮断されていた時期で、はーこんなこともあるもんだなと珍しがったりしていた。土産はクロアチアビールと干しイチジクだが最近人と会わないので減る気配がない。


旅行中にR7RSを読んでいたらおやっと思うところがあったのを思い出したので書いておく。syntax-rulesによるlet-valuesの定義の部分だ。

5,6番目の規則のtemplateで未束縛のidentifierであるxが挿入されている。コードを見るとxがgensymで生成したシンボルのようにふるまうことを期待されていることがうかがえる。この振舞いはR7RSで保証されているのか、されているならどのような仕組みによるのか、というところが今回気になった部分。

結論から言うとR7RSの4.3.2-Pattern languageの部分にidentifierの健全性についての規則が書いてある。

Identiers that appear in the template but are not pattern variables or the identier hellipsisi are inserted into the output as literal identiers. If a literal identier is inserted as a free identier then it refers to the binding of that identier within whose scope the instance of syntax-rules appears. If a literal identier is inserted as a bound identier then it is in eect renamed to prevent inadvertent captures of free identiers.

xが適用されるのは太字部分。ぶっちゃけるとここの英語がよくわからないのが一番苦労した部分なのだけれど(ワハハ)。よくわからないので和訳から引用。

もしリテラル識別子が自由識別子として挿入されるならば,その場合,その識別子の束縛であって,かつ元々のsyntax-rules のインスタンスが現れている箇所を含んでいるようなスコープの束縛が参照される。

なるほど???


最後に参考になったものを

# 追記
explicit-renamingのrenamerが行う処理もこれと同じ(らしい)
ただ、renamerとは別にgensymがあった方が便利なシチュエーションはある気がする