Program Club

TemplateHaskell을 사용하여 네임 스페이스의 모든 이름 나열

proclub 2020. 10. 27. 23:43
반응형

TemplateHaskell을 사용하여 네임 스페이스의 모든 이름 나열


범위에있는 모든 변수의 variablesInScope :: Q [Name]목록을 반환 하는 TemplateHaskell 함수 원합니다 Name. TemplateHaskell 분명히 같은 기능을 구현하기 위해이 정보가 reify :: Name -> Q InfolookupValueName :: 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

반응형