2011-11-15 6 views
13

2つの機能がどのように実装されているかに違いはありますか?私。古い良い表現木の上に構築されたコード引用だけではありませんか?コード引用と式ツリー

ありがとうございました。

答えて

20

2つのタイプはかなり似ていますが、表現が異なります。

  • 見積もりはより機能的に設計されています。例えば、foo a bは、一連のアプリケーションとして表されます。

  • 引用は、F#でのみ利用可能ないくつかの構文を表すことができ、式ツリーを使用するとそれらを隠すことができます。たとえば、let rec宣言の場合はExpr.LetRecursiveがあります。

  • .NET 3.0では初めて引用符が導入されました。当時の表現木はC#表現しか表現できなかったので、すべてのF#構造体を簡単に捕捉することはできませんでした(引用文は、命令型命令を含むF#式を取り込むことができます)。

  • 見積もりは、再帰を使用して簡単に処理できるようにも設計されています。 ExprShapeモジュールには、4つのケースですべての見積もりを処理できるパターンが含まれています(これは、C#で数十のメソッドを持つビジターパターンを実装するよりも簡単です)。あなたはF#の引用を持っている場合

、あなたはFSharp.Quotations.Evaluatorを使用してC#の式ツリーにそれを翻訳することができます。これは、F#の式ツリーが必要な.NET APIを使用している場合には非常に便利です。私が知る限り、逆の翻訳はありません。