在F#中编译代码报价的最新方法是什么?

时间:2013-03-10 13:43:20

标签: compilation f# quotations

我正在构建一个符号衍生引擎。例如

let f = <@ fun x:double -> x * x @>
let df = der f

,结果表达式为

<@ 2 * x @>

实际的方程式可能是任意复杂的。

使用递归生成衍生物并不太难 模式匹配和转换但最终我想使用 在紧密数值循环中生成的方程就好像我有手一样 写下来。这是数值计算代码,因此总是更快 更好(如果可能的话)

我查看了FSharpX引用编译器,但它看起来像是解释器而不是编译器。

1 个答案:

答案 0 :(得分:7)

我没有对此进行过测试,但是将F#引用转换为LINQ表达式(并编译它们)的代码现在已从F#PowerPack转移到F#Core库中,所以我认为这是最新版本:

open Microsoft.FSharp.Linq.RuntimeHelpers

LeafExpressionConverter.EvaluateQuotation <@ 1 + 2 @>

并将其用于lambdas

let d=LeafExpressionConverter.EvaluateQuotation <@ fun y -> y+1.0 @> 
    :?> ( double -> double )

Console.WriteLine(d 10)

输出

11

注意最后的演员将''obj''转换为正确类型的lambda