Я продолжаю работать над принтером для выражений в кавычках F #, это не так. не обязательно быть идеальным, но я бы хотел посмотреть, что возможно. Активные шаблоны в Microsoft.FSharp.Quotations.Patterns
и Microsoft.FSharp.Quotations.DerivedPatterns
, используемые для декомпозиции выражений в кавычках, обычно предоставляют экземпляры MemberInfo
, когда это необходимо, их можно использовать для получения имени свойства, функции и т. д. и их «декларирующего» типа, такого как модуль или статический класс. Проблема в том, что я знаю только, как получить CompiledName
из этих экземпляров, но мне нужно имя F #. Например,
> <@ List.mapi (fun i j -> i+j) [1;2;3] @> |> (function Call(_,mi,_) -> mi.DeclaringType.Name, mi.Name);;
val it : string * string = ("ListModule", "MapIndexed")
Как можно переписать это совпадение, чтобы вернуть («Список», «mapi»)
? Возможно ли это?
К вашему сведению, вот мое последнее отполированное решение от Стрингера Белла и помощи 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);