2011-08-06 17 views
3

アセンブリから[<ReflectedDefinition>]とマークされたトップレベル関数から見積りを取得する方法を理解したいと思います。F#アセンブリからの見積データの読み込み - explicitRegisterTopDefs関数

Tomas Petricek's blog: Quotation Visualiser Reloadedのように見えますが、コードの末尾にexplicitlyRegisterTopDefsという簡単な呼び出しがあり、トップレベルの引用符付きの定義を取得しています。

PowerPackまたはF#コンパイラの最新バージョン(このバージョンは.Net 4.0で動作しています)では、この機能が見つからないようです。

hereが表示されているように、記事が書かれたときに多くのことが変更されました。たとえば、Microsoft.FSharp.Quotations.Rawがリファクタリングされました。

PowerPack /コンパイラの最新バージョンでこれらのトップレベルの見積りを取得する方法を知っている人はいますか?

ありがとうございました。

答えて

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" 

これはあなたのシナリオに役立ちます。

しかし、それには多大な問題があります。最も悲しいのは、これらのアクティブなパターンが例外をスローすることです。さらに、彼らはSystem.Reflectionに基づいています。これは非常に遅くなります。また、あなたのために解決されていない見積もりや、特定のコンストラクターの引用が失敗するなど、予期しないことを考慮する必要があります。

今後のWebSharper 2.4では、バイナリ形式の定義としてF#コンパイラソースを使用し、速さと信頼性を大幅に改善して、引用ロードコードを最初から書き直しました。

+0

はい - これはうまくいくはずです。 F#ライブラリの新しい(ish)バージョンは、現在のものとは別のアセンブリからでも、引用を自動的に読み込みます。 –

関連する問題