13

明らかなことを見落としていないことを願っていますが、F# 式をいじっていて、引用符で囲まれた式をその場で評価したいと思っています。たとえば、次のように書きたいとします。

let x = <@ 2 * 5 @>
let y = transform x // replaces op_Multiply with op_Addition, or <@ 2 + 5 @>
let z = eval y // dynamically evaluates y, returns 7

引用符で囲まれた式を評価できる組み込みの F# メソッドはありますか?それとも独自に作成する必要がありますか?

4

5 に答える 5

18

Unquoteの一部として、リフレクション ベースの Quotation エバリュエーターを実装しました(これはバージョン 2.0.0 の新機能です)。

> #r @"..\packages\Unquote.2.2.2\lib\net40\Unquote.dll"

--> Referenced '..\packages\Unquote.2.2.2\lib\net40\Unquote.dll'

> Swensen.Unquote.Operators.eval <@ sprintf "%A" (1,2) @>;;
val it : string = "(1, 2)"

PowerPack のエバリュエーターよりも最大 50 倍高速であることが測定されました。もちろん、これはシナリオによって異なります。しかし、Unquote は通常、式の解釈において PowerPack よりもはるかに高速です。

また、VarSet、PropertySet、FieldSet、WhileLoop、ForIntegerRangeLoop、Quote など、PowerPack のエバリュエーターよりも多くの式をサポートしています。実際、Unquote のエバリュエーターは、NewDelegate、AddressSet、および AddressOfを除くすべての引用式をサポートしています。これらはいずれもサポートする予定です。

于 2011-07-08T22:08:11.840 に答える
8

次のように、DLLEvalによって提供される拡張メンバーを使用して、F# クォーテーションを評価できます。FSharp.PowerPack.Linq

#r "FSharp.PowerPack.Linq.dll"

open Linq.QuotationEvaluation
let f = <@2 + 3@>
f.Eval()

この拡張メンバーを使用可能にするには、名前空間openが必要であることに注意してください。Linq.QuotationEvaluation

サスペンションを戻すエクステンションメンバーもありCompileますが、性能が向上する様子はありません。

于 2011-07-09T09:17:34.177 に答える