GHC를 사용하여 Parse 및 TypeCheck Haskell을 사용하기위한 자습서가 필요합니다.

StackOverflow https://stackoverflow.com/questions/2242986

  •  19-09-2019
  •  | 
  •  

문제

Haskell 코드를 분석하기위한 프로젝트를 진행하고 있습니다. 나는 GHC를 사용하여 소스를 구문 분석하고 내 자신의 코드를 작성하지 않고 유형을 추론하기로 결정했습니다. 지금, 나는 Haddock 문서를 통해 슬로깅하고 있지만 느리게 진행됩니다. 좋은 튜토리얼을 아는 사람이 있습니까?

편집 : 명확히하기 위해, 나는 hlint와 같은 것을 찾고 있지 않습니다. Haskell 코드의 런타임 특성을 분석하기 위해 내 도구를 작성하고 있으므로 다른 hlint를 작성하는 것과 같습니다. 내가 찾고있는 것은 기본적으로 위키 페이지의 확장입니다. 도서관으로서 GHC.

도움이 되었습니까?

해결책

아담, 이것은 꽤 힘든 썰매입니다. 2006 년에 출시 된 이래로 GHC API는 다소 문서화되었습니다. 내가 권장하는 것은 GHC API를 사용하여 작성된 작은 응용 프로그램을 찾는 것입니다. 물어볼 올바른 장소는 아마도 GHC 사용자의 메일 링리스트.

그러한 프로그램 중 하나입니다 ghctags, GHC 소스 트리와 함께 배송합니다. 원래 버전을 썼지 만 추천 할 수는 없습니다. 코드에 발자국이 너무 많아서 더 이상 팔로우 할 수 없습니다. 내가 말할 수있는 가장 좋은 점은 따라 가기가 어렵지만 적어도 작은 따라 가기가 어렵습니다. 모든 GHC보다 훨씬 간단합니다.

다른 팁

아! 문서에 대한 훨씬 더 나은 진입 점을 찾았습니다. http://www.haskell.org/ghc/docs/latest/html/libraries/ghc-6.12.1/ghc.html

나는 그것을 업데이트했다 Wikipage 이 예제 :

여기서 우리는 parsemodule, typecheckmodule, desugarmodule, getnamesinscope 및 getModuleGraph를 호출하는 것을 보여줍니다. 이것은 Haskell-Platform, GHC-6.12.1에서 작동합니다.

버그 : libdir는 하드 코드가 있습니다. 위의 GHC-Paths를 참조하십시오.

--A.hs
--invoke: ghci -package ghc A.hs
import GHC
import Outputable

--import GHC.Paths ( libdir )
import DynFlags ( defaultDynFlags )
libdir = "/usr/local/lib/ghc-6.12.1"
targetFile = "B.hs"

main = do
   res <- example
   print $ showSDoc ( ppr res )

example = 
    defaultErrorHandler defaultDynFlags $ do
      runGhc (Just libdir) $ do
        dflags <- getSessionDynFlags
        setSessionDynFlags dflags
        target <- guessTarget targetFile Nothing
        setTargets [target]
        load LoadAllTargets
        modSum <- getModSummary $ mkModuleName "B"
        p <- parseModule modSum
        t <- typecheckModule p
        d <- desugarModule t
        l <- loadModule d
        n <- getNamesInScope
        c <- return $ coreModule d

        g <- getModuleGraph
        mapM showModule g     
        return $ (parsedSource d,"/n-----/n",  typecheckedSource d)

--B.hs
module B where

main = print "Hello, World!"

구문 분석이 가장 중요한 경우 Haskell-Src-Exts를 권장합니다. 그것은 모든 확장 더미 인 haskell98을 모두 구문 분석하고 사용하기가 매우 쉽습니다.

그만큼 Haskell Wiki 그리고 GHC 문서 기사를 검색하면 원하는 것이있을 것입니다. 또한 관심이있는 도구도 있습니다 hlint, 소스 코드에 대한 구문 및 기타 사항을 확인합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top