2011-08-06 3 views
3

어셈블리에서 [<ReflectedDefinition>]으로 표시된 최상위 함수에서 인용을 검색하는 방법을 알고 싶습니다.F # 어셈블리에서 인용 데이터로드 - explicitRegisterTopDefs 함수

Tomas Petricek's blog: Quotation Visualiser Reloaded이 코드는 문서의 맨 끝에 있으며 explicitlyRegisterTopDefs을 호출하면 최상위 수준의 인용 된 정의를 검색 할 수 있습니다.

PowerPack 또는 F # 컴파일러의 최신 버전에서이 기능을 찾지 못했습니다. (.Net 4.0으로 작업하고 있습니다.)

기사 작성 시점이 2006 년 이래로 변경된 일이 많습니다. 예를 들어, Microsoft.FSharp.Quotations.Raw이 리팩토링 된 경우는 here입니다.

누구나 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" 

이 시나리오가 도움이되기를 바랍니다.

그러나 문제가 많습니다. 가장 슬픈 것은 이러한 활성 패턴이 때때로 예외를 throw한다는 것입니다. 또한 그들은 System.Reflection을 기반으로하므로 작업 속도가 크게 느려집니다. 또한, 당신을 위해 해결되지 않은 인용문, 특정 생성자 인용문이 실패하는 등의 예기치 않은 일들에 대해 설명해야합니다.

곧 출시 될 WebSharper 2.4에서는 바이너리 형식의 정의로 F # 컴파일러 소스를 사용하고 System.Reflection을 피하면서 속도와 안정성이 크게 향상되어 인용로드 코드를 처음부터 다시 작성했습니다.

+0

예 - 정상적으로 작동합니다. F # 라이브러리의 새 버전 (ish)은 현재 어셈블리가 아닌 다른 어셈블리에서도 자동으로 견적을로드합니다. –