R6RS:翻訳:Standard Libraries:12.1 Hygiene

R6RS:翻訳:Standard Libraries:12.1 Hygiene

12.1 健全性

Barendregt のラムダ計算の 健全性条件 [1] とは、別の式 M に代入される式 N があったとき、その中の自由変数が、期せずして M 中の束縛により捕捉されないことを要求する非形式的な概念である。 Kohlbecker らは、これに対応して、明示的な捕捉のない場合すべてに適用できる マクロ展開の健全性条件 を提案した[9]。 曰く、「自動生成された識別子で、展開後のプログラムで実際の束縛になるものは、同一の転写段階で生成された変数だけを束縛しなければならない。」本文書の用語では、「生成された識別子」は変換子に渡されたフォーム中に存在せず変換子により挿入されたものを指し、「マクロ転写段階」は展開器による変換子呼び出しを指すものとする。 また、健全性条件は変数束縛だけでなく、すべての束縛に適用される。

挿入された識別子が同一の変換子呼び出しで挿入された束縛の外側に現れた場合の動作は保留されている。 このような識別子は、実際は、変換子の本体部分や、変換子の呼び出した補助手続きの(syntax <template> のなかの — R6RS:翻訳:Standard Libraries:12.4 Parsing input and producing output 節参照)静的スコープを参照する。 これは、本質的には Clinger と Rees の言うところの参照透過性である [3]。したがって、健全性条件は以下のように言い換えられる。

展開器による変換子呼び出しにより出力に挿入された識別子の束縛は同一の変換子呼び出しにより挿入された識別子の参照だけを捕捉しなければならない。 出力に挿入された識別子への参照は、挿入された識別子を取り囲むもっとも近い束縛を参照し、挿入された識別子の外側の束縛のまったくない場所にあらわれた場合には、変換子の本体部分か変換子の呼び出した補助手続きのなかの(syntax <template> 内部の)、もっとも近い束縛を参照する。

明示的な捕捉は datum->syntax でおこなわれる。 R6RS:翻訳:Standard Libraries:12.6 Syntax-object and datum conversions 節参照。

操作上、展開器はマークと置換を使って健全性を保持する。 マークは変換子の出力に対して展開器が選択的に適用し、置換は束縛変数のスコープ内にあるものとして各束縛フォームに適用される。 マークは別々の段階で挿入された同名の識別子(入力にもともとあったものや、特定の変換子の呼び出しで出力に挿入されたもの)を区別するのに使われ、 置換は識別子を展開時の値に対応させるのに使われる。

展開器がマクロの使用に遭遇すると、入力に逆マークを適用し、対応する変換子を起動して出力に新たなマークを適用する。マークと逆マークは取り消され、入力の一部で、出力に現れるものは事実上マークなしの状態になり、その一方で、出力に導入されたものは新規のマークでマークされる。

展開器は束縛フォームに遭遇すると一群の置換を作成し、各置換で(マークのついた)束縛識別子をその束縛情報に対応づける (lambda 式に対しては、展開器は各束縛識別子を、展開器の出力の仮引き数に対応させ、 let-syntax フォームに対しては、各束縛識別子を対応する変換子と対応させる)。 この置換は入力のうち、その束縛が参照可能な部分に対しておこなわれる。

マークと置換は展開器に処理されるフォームを層をなしてラップし、それが葉の部分にむかって必要に応じて折り重なっていく。 ラップされたフォームはラップされた構文オブジェクトとして参照される。 最終的にはこの層は識別子を表す葉の部分までのこってい、この場合ラップされた構文オブジェクトは、より正確には識別子として参照される。 識別子はこのラップに加えて名前を格納している(名前は一般にシンボルで表される)。

ある識別子と展開時の値に対する置換データを作成するとき、展開時の値に加えて、識別子の名前とその識別子に適用されたマークも記録される。 展開器はもっとも最近に識別子に適用された置換 — すなわち、ラップ中の置換でいちばん外側にあり名前とマークの一致するもの — を探索して識別子の参照を解決する。 名前はそれが同一の名前である場合(シンボルを使っている場合は eq? であれば)一致し、マークは置換とともに記録されているマークが下層に現れたものと同一である場合、すなわち、そのマークが置換よりも前に適用された場合に一致する。 置換よりあとにほどこされたマーク、すなわち置換のおこなわれたのより上の層にあらわれたマークは適切なものとは見做されず無視される。

マークと置換の動作のより正確な代数的定義は Oscar Waddell の博士論文の 2.4 節を参照[13]。


Last modified : 2008/03/02 23:00:10 UTC