Pregunta

Estoy trabajando en un proyecto de análisis de código Haskell. Decidí usar GHC para analizar la fuente e inferir tipos en lugar de escribir mi propio código para hacer eso. En este momento, estoy penosamente a través de los documentos Haddock, pero está algo lento. ¿Alguien sabe de un buen tutorial?

EDIT: Para aclarar, no estoy buscando algo como hlint. Estoy escribiendo mi propia herramienta para analizar las características de tiempo de ejecución de código Haskell, así que es como si estuviera escribiendo un hlint diferente. Lo que estoy buscando es básicamente una expansión de la página wiki GHC Como una biblioteca .

¿Fue útil?

Solución

Adam, esto es bastante difícil trineo. Desde su lanzamiento en 2006, la API GHC ha sido algo poco documentadas. Lo que yo recomendaría es tratar de encontrar algunas pequeñas aplicaciones que se han escrito utilizando el API de GHC. El lugar adecuado para preguntar es probablemente el usuarios GHC lista de correo .

Uno de estos programas es ghctags, que se suministra con el árbol de fuentes GHC. Escribí la versión original, pero no puedo recomiendo-hay tantas huellas en el código que ya no puedo seguirla. Lo mejor que puedo decir es que aunque es difícil de seguir, que es al menos pequeña y difícil de seguir, mucho más simple que todos GHC.

Otros consejos

Ah! encontrado un mejor punto de entrada en la documentación en:    http://www.haskell.org /ghc/docs/latest/html/libraries/ghc-6.12.1/GHC.html

He actualizado el wikipage con este ejemplo:

Aquí demostramos llamando parseModule, typecheckModule, desugarModule, getNamesInScope y getModuleGraph. Esto funciona para Haskell-plataforma, GHC-6.12.1.

insectos: libdir es codificado. Ver GHC-vías de acceso anteriores.

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

Si el análisis es lo más importante, recomiendo Haskell-src-exts. Se analiza todos Haskell98, toda una pila de extensiones y es muy fácil de usar.

El Haskell wiki y documentación GHC probablemente tiene lo que busca si la búsqueda de los artículos. También es una herramienta que podría estar interesado en es hlint , para comprobar la sintaxis y otras cosas acerca de su código fuente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top