2014-10-16 15 views
72

Tôi muốn hàm TemplateHaskell variablesInScope :: Q [Name] trả về danh sách tất cả các biến trong phạm vi của Name. TemplateHaskell rõ ràng có sẵn thông tin này để thực hiện các chức năng như reify :: Name -> Q InfolookupValueName :: String -> Q (Maybe Name).Sử dụng TemplateHaskell để liệt kê tất cả các tên trong không gian tên

Chức năng tôi muốn tồn tại ở đâu đó và tôi chỉ bỏ qua nó? Hay nó có thể dễ dàng được xây dựng bằng cách nào đó?

+2

Tôi khá chắc chắn bạn không thể làm điều này chỉ với TH, nhưng bạn có thể sử dụng 'haskell-src-meta' để phân tích cú pháp mô-đun Haskell thành TH AST. – user2407038

+1

Điều đó có yêu cầu sử dụng các tính năng IO của đơn nguyên 'Q' để tải mô-đun, và sau đó gửi nó đến' haskell-src-meta'? yikes. Ngoài ra, điều này không thể phân biệt được tên nào để sử dụng trong phạm vi cụ thể mà mối nối là tại. –

+1

Có, bạn cần sử dụng IO để thực sự đọc tệp. Tôi không chắc chắn tôi hiểu tuyên bố thứ hai của bạn - tại sao bạn cần phải phân biệt nếu bạn đang nhận được * tất cả * tên? Bạn có thể mở một vé cho một yêu cầu tính năng, tôi nghi ngờ rằng cơ chế bên dưới mà quyền hạn TH có tất cả các tên trong phạm vi có sẵn anyways. – user2407038

Trả lời

1

Thật không may, bạn không thể thực hiện việc này chỉ với một mình TH. Hãy thử haskell-src-meta để phân tích cú pháp mô-đun Haskell dưới dạng TH AST.

Nó sẽ yêu cầu các tính năng IO của Q đơn nguyên để tải mô-đun.

Vui lòng tham khảo https://ghc.haskell.org/trac/ghc/ticket/9699#ticket để xem spec thô hiện

(1) Mở rộng ModuleInfo (lấy từ reifyModule) để ModuleInfo [Lớp] [Tên], nơi [Lớp] vẫn là nhập khẩu danh sách và [Tên] chứa danh sách các tên đã xuất của mô-đun.

(2) Thêm mô-đun này :: Q Mô-đun tạo mô-đun hiện tại.

(3) Thêm topLevelNames :: Q [Tên] tạo danh sách các tên cấp cao nhất (cả xuất và không xuất) bị ràng buộc trong mô-đun hiện tại sẽ hiển thị để sửa lại.

(4) Thêm nestedNames :: Q [Tên] (cần có tên tốt hơn) tạo danh sách tên không phải cấp cao nhất (lồng nhau) có thể nhìn thấy trong bối cảnh này.

(5) Thêm parentNames :: Q [Tên] (cũng cần một tên tốt hơn) tạo danh sách tên ngay lập tức liên kết với bối cảnh nối hiện tại, nếu có. Ví dụ: foo, bar :: $ (typeSplice) sẽ thấy [foo, bar], foo = $ (exprSplice) sẽ thấy [foo] và $ (topLevelDecSplice) sẽ thấy [].

(6) Tùy chọn Thêm isTopLevel :: Tên -> Q Bool để phát hiện xem tên có bị ràng buộc ở cấp cao nhất (của mô-đun hiện tại không?). Một cái gì đó như thế này có thể luân phiên được thực hiện bằng cách tìm kiếm thông qua topLevelNames.

Các vấn đề liên quan