代码之家  ›  专栏  ›  技术社区  ›  Juliet

在F中计算引用表达式#

  •  12
  • Juliet  · 技术社区  · 17 年前

    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#方法可以计算引用的表达式,还是我必须自己编写?

    5 回复  |  直到 17 年前
        1
  •  18
  •   johv Chris    12 年前

    我已经实现了一个基于反射的报价评估器,作为 Unquote (这是从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的evaluator快50倍。当然,这将因情况而异。但Unquote在解释表达式方面通常比PowerPack快很多。

    除了 NewDelegate、AddressSet和AddressSet,我计划最终支持它们。

        2
  •  9
  •   MichaelGG    17 年前

    不,没有编译F#quotes的内置方法。使用PowerPack LINQ,您可以将一些引用转换为.NET System.LINQ.Expressions.Expression,并使用它来编译它们。

    引用是为了允许对代码进行其他解释,例如针对SQL或GPU卡。

    然而,在hubfs上的帖子中,有人暗示这是一个常见的请求,我们将对此进行研究。

        3
  •  8
  •   J D    15 年前

    您可以使用 Eval 扩展成员由 FSharp.PowerPack.Linq DLL如下所示:

    #r "FSharp.PowerPack.Linq.dll"
    
    open Linq.QuotationEvaluation
    let f = <@2 + 3@>
    f.Eval()
    

    open 这个 Linq.QuotationEvaluation 命名空间以使此扩展成员可用。

    还有一个 Compile

        4
  •  6
  •   Overlord Zurg    10 年前

    2016年更新

    这个 Evaluate 现在可以在NuGet包中找到扩展方法 FSharp.Quotations.Evaluator

    #r "../packages/FSharp.Quotations.Evaluator.1.0.7/lib/net40/FSharp.Quotations.Evaluator.dll"
    
    open FSharp.Quotations.Evaluator
    
    let f = <@ 2 + 3 @>
    f.Evaluate()
    
        5
  •  -1
  •   Dario    17 年前

    .eval() -方法。

    推荐文章