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

bra*_*ing 7 f# compilation quotations

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

let f = <@ fun x:double -> x * x @>
let df = der f
Run Code Online (Sandbox Code Playgroud)

结果表达式将是

<@ 2 * x @>
Run Code Online (Sandbox Code Playgroud)

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

使用递归模式匹配和变换,衍生物的生成并不太难,但最后我想在紧密数值循环中使用生成的方程式,就像我手写它们一样.这是数值计算代码,所以更快总是更好(如果可能的话)

我看过FSharpX报价编译器,但它看起来像是一个解释器而不是编译器.

Tom*_*cek 7

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

open Microsoft.FSharp.Linq.RuntimeHelpers

LeafExpressionConverter.EvaluateQuotation <@ 1 + 2 @>
Run Code Online (Sandbox Code Playgroud)

并将它用于lambdas

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

Console.WriteLine(d 10)
Run Code Online (Sandbox Code Playgroud)

输出

11
Run Code Online (Sandbox Code Playgroud)

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