2017-01-03 3 views
1

유효한 Haskell 코드가 포함 된 String (또는 Text 또는 그 이상)이 있다고 가정 해보십시오. Template Haskell을 사용하여 [Dec]으로 변환 할 수 있나요?Template Haskell로 원시 소스 코드를 내보낼 수 있습니까?

AST가 GHC에 직접 연결되지 않기 때문에 프린트가되고 어쨌든 구문 분석 단계가 될 것입니다.

TH에 대해 다른 "백엔드"를 허용하므로 좋을 것입니다. 예를 들어, TH보다 더 많은 하스켈 구문을 지원하는 haskell-src-exts의 AST를 사용할 수 있습니다.

+1

왜 AST가 GHC로 직접 이동하지 않는다고 생각합니까? 그것은 솔직히 나를 놀라게 할 것이다. – melpomene

+0

제목이 질문과 일치하지 않는 것 같습니다. 나는 당신이'덤프 스플 릭스'를 찾고 있다고 생각했다. – jberryman

+0

@jberryman 나는 동의한다. 더 나은 것을 제안하십시오. –

답변

6

AST가 GHC로 직접 이동하지 않으므로 어쨌든 인쇄 및 다음 단계로 파싱 할 것입니다.

왜 그렇게 생각하니? 그렇지 않은 경우 TH AST는 GHC의 내부 AST로 직접 변환됩니다. 그 프로세스의 어느 시점에서든 결코 텍스트로 변환되지 않습니다. (이 그랬다면, 그것은 매우 이상한 것입니다.) 아직

, 템플릿 하스켈은 기본적으로 다양한 e 뒤에 파서를 노출, 표현, 유형 및 선언에 하스켈 소스를 구문 분석하는 방법을 노출하는 경우가 다소 좋은 것, t , 템플릿 Haskell에 내장 된 d의 견적서가 있습니다. 불행히도, 그렇지 않습니다. 그리고 저는 현재 그것을 바꿀 계획이 없다고 생각합니다.

현재 haskell-src-exts을 통과해야합니다. 이것은 다소 이상적입니다. 은 의 파서와 GHCs 사이의 차이는이고, 현재 얻을 수있는만큼 좋습니다. 고통을 줄이기 위해 과 template-haskell을 연결하는 a package called haskell-src-meta이 있습니다.

사용 사례의 경우 String -> Either String [Dec] 유형의 Language.Haskell.Meta.Parse에서 parseDecs 함수를 사용할 수 있습니다.

+0

흠, 이것은 거의 충분하지만, 'haskell-src-exts'가 보이는 동안 TH와 같이 보이는 타입을 지원하지 않는 것은 도움이되지 않습니다. 주석/문서는 말할 것도 없습니다. –

+0

[템플릿 Haskell이 왜 파서를 인용 부호에 노출시키지 않는지에 관하여] (http://stackoverflow.com/a/40985623/3072788). – Alec

+0

@Alec 아마 [네이티브 메타 프로그래밍을위한 제안] (https://ghc.haskell.org/trac/ghc/wiki/NativeMetaprogramming)을 사용하면 훨씬 쉽게 할 수 있을까요? –