F#从程序集加载引用数据 - explicitRegisterTopDefs函数

Ncc*_*Ncc 3 f# metaprogramming

我想了解如何从标记[<ReflectedDefinition>]为程序集的顶级函数中检索引号.

看起来这是在这里完成的:Tomas Petricek的博客:Quotation Visualiser Reloaded,但是代码(在文章的最后)做了一个简单的调用explicitlyRegisterTopDefs来检索顶级引用的定义.

我似乎无法在最新版本的PowerPack或F#编译器中找到此功能(我正在使用.Net 4.0).

自2006年撰写文章以来,很多事情发生了变化,例如,Microsoft.FSharp.Quotations.Raw重构,正如你在这里看到的那样.

有谁知道如何使用最新版本的PowerPack /编译器捕获这些顶级报价?

谢谢.

t0y*_*yv0 6

我们做了很多这样的WebSharper.基本上你做(不需要动力装置):

module QP = Quotations.Patterns
module QDP = Quotations.DerivedPatterns

[<ReflectedDefinition>]
let myFunc x = x + 1

match <@ myFunc 1 @> with
| QP.Call(_, QDP.MethodWithReflectedDefinition d, _) ->
    printfn "%A" d
| _ ->
    printfn "ERROR"
Run Code Online (Sandbox Code Playgroud)

我希望这对您的方案有所帮助.

但请注意,它有很多问题.最严重的是,这些活跃的模式不时会抛出异常.此外,它们的基础System.Reflection是减慢速度.此外,您必须考虑到意外的事情,例如引用currying没有为您解决,某些构造函数引用失败,等等.

对于即将推出的WebSharper 2.4,我最终从头开始重写报价加载代码,使用F#编译器源作为二进制格式的定义并避免System.Reflection,并且在速度和可靠性方面有很大改进.