F#从程序集加载报价数据-explicitlyRegisterTopDefs函数
我想了解如何从程序集中从标有F#从程序集加载报价数据-explicitlyRegisterTopDefs函数,f#,metaprogramming,F#,Metaprogramming,我想了解如何从程序集中从标有[]的顶级函数中检索报价 看起来这是在这里完成的:,但是代码(在文章的最后)简单地调用explicitlyRegisterTopDefs来检索顶级引用定义 在最新版本的PowerPack或F#编译器中,我似乎找不到这个函数(我正在使用.NET4.0) 自2006年写这篇文章以来,很多事情都发生了变化,例如,正如您所看到的,Microsoft.FSharp.quotes.Raw被重构 有人知道如何用最新版本的PowerPack/编译器捕获这些顶级引用吗 谢谢。我们做了很
[]
的顶级函数中检索报价
看起来这是在这里完成的:,但是代码(在文章的最后)简单地调用explicitlyRegisterTopDefs
来检索顶级引用定义
在最新版本的PowerPack或F#编译器中,我似乎找不到这个函数(我正在使用.NET4.0)
自2006年写这篇文章以来,很多事情都发生了变化,例如,正如您所看到的,Microsoft.FSharp.quotes.Raw
被重构
有人知道如何用最新版本的PowerPack/编译器捕获这些顶级引用吗
谢谢。我们做了很多类似这个WebSharper的东西。基本上是这样(不需要电源组):
module QP=quotes.Patterns
模块QDP=Quotements.DerivedPatterns
[]
设myFunc x=x+1
匹配
|QP.Call(uqdp.methodwithreflecteddefinitiond,QDP)->
打印fn“%A”d
| _ ->
printfn“错误”
我希望这对您的场景有所帮助
但是请注意,它有很多问题。最严重的是,这些活动模式不时抛出异常。此外,它们基于System.Reflection
,大大降低了速度。此外,您还必须考虑意外的事情,例如没有为您解决引用的问题,某些构造函数引用失败,等等
对于即将发布的WebSharper 2.4,我最终重新编写了引用加载代码,使用F#编译器源代码作为二进制格式的定义,避免了系统反射,大大提高了速度和可靠性。是的-这应该可以工作。新(ish)版本的F#库会自动加载引用,甚至从当前程序集以外的其他程序集加载引用。
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"