Pergunta

Eu estou trabalhando em um projeto para análise de código Haskell. Eu decidi usar GHC para analisar os tipos de fontes e inferir, em vez de escrever meu próprio código para fazer isso. Agora, eu estou slogging através dos docs Haddock, mas é lento. Alguém sabe de um bom tutorial?

EDIT: Para esclarecer, eu não estou procurando algo como hlint. Eu estou escrevendo minha própria ferramenta para analisar as características de execução de código Haskell, por isso é como se eu estou escrevendo um hlint diferente. O que eu estou procurando é basicamente uma expansão da página wiki GHC Como biblioteca.

Foi útil?

Solução

Adam, este é trenó muito difícil. Desde o seu lançamento em 2006, a API GHC tem sido um pouco underdocumented. O que eu recomendo é tentar encontrar alguns pequenos aplicativos que foram escritos usando a API do GHC. O lugar certo para perguntar é provavelmente o GHC usuários lista de discussão .

Um desses programas é ghctags, que acompanha a árvore fonte GHC. Eu escrevi a versão original, mas eu não posso recomendá-lo-há tantas pegadas no código que eu já não pode segui-lo. O melhor que posso dizer é que embora seja difícil de seguir, é, pelo menos, pequena e difícil de seguir-muito mais simples do que todos GHC.

Outras dicas

Ah! encontrou um ponto de entrada muito melhor para os docs em: http://www.haskell.org /ghc/docs/latest/html/libraries/ghc-6.12.1/GHC.html

Eu atualizei o wikipage com este exemplo:

Aqui demonstramos chamando parseModule, typecheckModule, desugarModule, getNamesInScope e getModuleGraph. Isso funciona para haskell-platform, ghc-6.12.1.

erros: libdir é codificado. Veja ghc-trajetos acima.

--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!"

Se a análise é a coisa mais importante, eu recomendo Haskell-src-exts. Ele analisa todos Haskell98, uma pilha de extensões e é muito fácil de usar.

O Haskell wiki e documentação GHC provavelmente tem o que você está procurando se você procurar os artigos. Também uma ferramenta que você pode estar interessado em é hlint , para a verificação da sintaxe e outras coisas sobre o seu código-fonte.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top