TemplateHaskell을 사용하여 네임 스페이스의 모든 이름 나열
범위에있는 모든 변수의 variablesInScope :: Q [Name]목록을 반환 하는 TemplateHaskell 함수 를 원합니다 Name. TemplateHaskell 분명히 같은 기능을 구현하기 위해이 정보가 reify :: Name -> Q Info와 lookupValueName :: String -> Q (Maybe Name).
내가 원하는 기능이 어딘가에 존재하고 그냥 간과 했습니까? 아니면 어떻게 든 쉽게 만들 수 있습니까?
불행히도 TH혼자서 는 이것을 할 수 없습니다 . 을 시도 haskell-src-metaA와 하스켈 모듈을 구문 분석 TH AST.
Q하지만 모듈을로드하려면 모나드 의 IO 기능이 필요합니다 .
참조하시기 바랍니다 https://ghc.haskell.org/trac/ghc/ticket/9699#ticket을 현재의 대략적인 사양을 볼 수
(1) ModuleInfo (reifyModule에서 얻음)를 ModuleInfo [Module] [Name]으로 확장합니다. 여기서 [Module]은 여전히 가져 오기 목록이고 [Name]에는 모듈의 내 보낸 이름 목록이 포함됩니다.
(2) 현재 모듈을 생성하는이 모듈 :: Q 모듈을 추가합니다.
(3) 수정하기 위해 볼 수있는 현재 모듈에 바인딩 된 최상위 이름 (내 보낸 이름과 내 보내지 않은 이름 모두) 목록을 생성하는 topLevelNames :: Q [이름]을 추가합니다.
(4) 중첩 된 이름 추가 :: Q [이름] (더 나은 이름이 필요함)은이 컨텍스트에서 구체화 할 수있는 최상위 수준 (중첩 된) 이름이 아닌 목록을 생성합니다.
(5) 사용 가능한 경우 현재 스 플라이 싱 컨텍스트와 즉시 관련된 이름 목록을 생성하는 parentNames :: Q [이름] (더 나은 이름이 필요함)을 추가합니다. 예를 들어, foo, bar :: $ (typeSplice)는 [foo, bar]를, foo = $ (exprSplice)는 [foo]를, $ (topLevelDecSplice)는 []를 나타냅니다.
(6) 선택 사항 isTopLevel :: Name-> Q Bool을 추가하여 이름이 최상위 레벨 (현재 모듈의?)에 바인딩되었는지 여부를 감지합니다. 이와 같은 작업은 topLevelNames를 통해 검색하여 수행 할 수 있습니다.
참고 URL : https://stackoverflow.com/questions/26394199/using-templatehaskell-to-list-all-names-in-a-namespace
'Program Club' 카테고리의 다른 글
| 무작위로 테스트를 다시 시작하는 phpunit (0) | 2020.10.27 |
|---|---|
| Scala 2.10 매크로 문서화 (0) | 2020.10.27 |
| Python 3.x에는 어떤 SOAP 라이브러리가 있습니까? (0) | 2020.10.27 |
| Python C-API에서 파생 된 형식을 동적으로 만드는 방법 (0) | 2020.10.27 |
| 내 모든 JavaFX TextField에는 줄이 있습니다. (0) | 2020.10.27 |