2011-01-05 18 views
5

Tôi tiếp tục làm việc trên máy in cho các biểu thức được trích dẫn F #, nó không phải là hoàn hảo, nhưng tôi muốn xem có khả năng. Các mẫu hoạt động trong Microsoft.FSharp.Quotations.PatternsMicrosoft.FSharp.Quotations.DerivedPatterns được sử dụng để phân tách các biểu thức được trích dẫn thường sẽ cung cấp MemberInfo trường hợp khi thích hợp, chúng có thể được sử dụng để lấy tên của thuộc tính, chức năng, v.v ... và loại "tuyên bố", chẳng hạn như mô-đun hoặc lớp tĩnh . Vấn đề là, tôi chỉ biết làm thế nào để có được CompiledName từ những trường hợp này nhưng tôi muốn tên F #. Ví dụ:Cách lấy tên F # của mô-đun, chức năng, v.v. Từ Khớp biểu thức được trích dẫn

> <@ List.mapi (fun i j -> i+j) [1;2;3] @> |> (function Call(_,mi,_) -> mi.DeclaringType.Name, mi.Name);; 
val it : string * string = ("ListModule", "MapIndexed") 

Cách khớp này có thể viết lại để trả lại ("List", "mapi")? Có thể không?

FYI, đây là giải pháp của tôi thức đánh bóng từ Stringer Bell và giúp đỡ pblasucci của:

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); 
+2

Tôi khá chắc chắn rằng bạn có thể kiểm tra các thuộc tính tùy chỉnh của một phương pháp cho 'CompilationSourceNameAttribute'; thuộc tính 'SourceName' của nó phải là thứ bạn muốn. Tôi muốn đăng một câu trả lời với một mẫu thích hợp, nhưng tôi không ở gần một máy tính phát triển vào lúc này. – pblasucci

+0

Cảm ơn bạn đã chia sẻ! Bạn cũng có thể đăng nó lên http://fssnip.net của Tomas: D – Stringer

+0

@Stringer Bell - nghĩ rằng bạn có thể quan tâm, tôi đã bắt đầu một dự án mã nguồn mở Unquote (http://code.google.com/p/unquote /) mà kết hợp một máy in báo giá, mà tôi nói về cụ thể hơn ở đây: http://stackoverflow.com/questions/1448961/is-there-any-built-in-function-for-human-readable-f-quotations/ 4948660 # 4948660 –

Trả lời

4

Bạn có thể sử dụng F # PowerPack cho mục đích đó:

open Microsoft.FSharp.Metadata 
... 
| Call(_, mi, _) -> 
    let ty = Microsoft.FSharp.Metadata.FSharpEntity.FromType(mi.DeclaringType) 
    let name = ty.DisplayName // name is List 

Tuy nhiên, tôi không nghĩ rằng nếu có thể lấy tên hàm bằng powerpack.

Edit:

Như lời đề nghị bởi pblasucci, bạn có thể sử dụng CompilationSourceName thuộc tính để lấy tên nguồn:

let infos = mi.DeclaringType.GetMember(mi.Name) 
let att = infos.[0].GetCustomAttributes(true) 
let fName = 
    (att.[1] :?> CompilationSourceNameAttribute).SourceName // fName is mapi 
+0

Rất tốt, cảm ơn! _ –