5

F#での型なし/型付きコードの引用とマクロシステムの衛生状態との間に関係があるのだろうか。彼らはそれぞれの言語で同じ問題を解決しますか、それとも関心の分離ですか?

4

2 に答える 2

7

メタプログラミングの側面が唯一の類似点であり、その点でも大きな違いがあります。マクロのトランスフォーマーは、引用符を操作できるように構文から構文への関数と考えることができますが、バインダーとして使用される名前が特定のプロトコルに従うように、トランスフォーマーはグローバルに調整されます。

1)バインダーは、マクロへの入力の自由な名前と同じではない場合があります(非衛生的なエスケープハッチを使用する場合を除く)

2)マクロの展開で自由である、マクロ定義のコンテキストにバインドされた名前は、マクロの使用時に同じものを指している必要があります。(これにはグローバルな調整が必要です)

名前の選択は、間違った名前を使用した場合に展開が失敗しないように行われます(名前がバインドされていないことが判明した場合を除く)。

型付き引用符のトランスフォーマーには、この定義時間コンテキストのアイデアがありません。引用符を操作して、プログラム内の名前を参照しないプログラムを作成します。これらは、構文の抽象化メカニズムを提供することを意図したものではありません。構文の任意の形?いいえ。それはすべてコアAST形状でなければなりません。

型付き見積もりシステムのオープンコードは、予想されるコンテキストのタイプ構造に適合するもので閉じることができます。一貫した構造へのいくつかのオープンコンポーネントの調整された構成はありません。

于 2012-05-18T21:38:14.660 に答える
6

引用はメタプログラミングの一形態です。これらを使用すると、抽象構文ツリーをプログラムで操作できます。これをコードにスプライスして評価することができます。

型指定された引用符は、ホスト言語の型システムにASTの修正された型を埋め込むため、型指定のないコードのフラグメントを生成できないようにします。型指定されていない引用はその保証を提供しません(実行時エラーで失敗する可能性があります)。

余談ですが、型付きの引用符はTemplateHaskellの準引用符と非常によく似ています。

Lispのような言語のhygenicマクロは、メタプログラミングをサポートするために存在するという点で関連しています。ただし、衛生状態は、単純な名前キャプチャの混乱のためのものであり、準引用を入力した場合はすでに回避されています(およびそれ以上)。

そうです、それらは、それぞれ型付き言語と型なし言語でのメタプログラミングのメカニズムであるという点で似ています。型付きの準引用符と衛生的なマクロの両方が、完全に型付けされていない、健全でないメタプログラミングに安全性を追加します。彼らがプログラマーに提供する保証のレベルは異なりますが。入力された引用符は厳密に強力です。

于 2012-05-17T18:12:44.677 に答える