2011-08-06 41 views
3

我想了解如何從程序集中檢索標記爲[<ReflectedDefinition>]的頂級函數中的報價。F#從程序集中加載報價數據 - displayedRegisterTopDefs函數

看起來這是在這裏完成的:Tomas Petricek's blog: Quotation Visualiser Reloaded,但代碼(在文章的最後)只是簡單地調用explicitlyRegisterTopDefs來檢索頂級引用定義。

我似乎無法在最新版本的PowerPack或F#編譯器(我使用.Net 4.0)中找到此函數。

自2006年撰寫文章以來,發生了許多變化,例如Microsoft.FSharp.Quotations.Raw被重構,您可以看到here

有誰知道如何捕獲這些頂級報價與最新版本的PowerPack /編譯器?

謝謝。

回答

6

我們做了很多像這樣的WebSharper。基本上你(沒有powerpack需要):

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" 

我希望這可以幫助您的方案。

但請注意,它有很多問題。最令人痛心的是,這些活躍的模式不時拋出異常。另外,它們基於System.Reflection,這大大減緩了事情的速度。此外,你必須考慮到意想不到的事情,比如引用currying沒有爲你解決,某些構造引用失敗等等。

對於即將推出的WebSharper 2.4,我最終從頭開始重寫了引號加載代碼,使用F#編譯器源代碼作爲二進制格式的定義並避免了System.Reflection,並且速度和可靠性都有了很大的提高。

+0

是的 - 這應該工作。新的(ish)版本的F#庫會自動加載報價,甚至可以從當前的其他組件中加載報價。 –