私はF#で引用された式のプリンターで作業を続けています。完璧である必要はありませんが、何が可能かを見たいと思います。引用符で囲まれた式を分解するためMicrosoft.FSharp.Quotations.Patterns
に使用されるアクティブなパターンは、通常、適切な場合にインスタンスを提供します。これらは、プロパティ、関数などの名前と、モジュールや静的クラスなどの「宣言」タイプを取得するために使用できます。問題は、これらのインスタンスからを取得する方法しか知らないのですが、F#の名前が欲しいのです。例えば、Microsoft.FSharp.Quotations.DerivedPatterns
MemberInfo
CompiledName
> <@ List.mapi (fun i j -> i+j) [1;2;3] @> |> (function Call(_,mi,_) -> mi.DeclaringType.Name, mi.Name);;
val it : string * string = ("ListModule", "MapIndexed")
この一致をどのように書き直して返すことができ("List", "mapi")
ますか?出来ますか?
参考までに、これがStringerBellとpblasucciの助けによる私の最終的な洗練されたソリューションです。
let moduleSourceName (declaringType:Type) =
FSharpEntity.FromType(declaringType).DisplayName
let methodSourceName (mi:MemberInfo) =
mi.GetCustomAttributes(true)
|> Array.tryPick
(function
| :? CompilationSourceNameAttribute as csna -> Some(csna)
| _ -> None)
|> (function | Some(csna) -> csna.SourceName | None -> mi.Name)
//usage:
let sourceNames =
<@ List.mapi (fun i j -> i+j) [1;2;3] @>
|> (function Call(_,mi,_) -> mi.DeclaringType |> moduleSourceName, mi |> methodSourceName);