2010-02-11 8 views
24

Estoy trabajando en un proyecto para analizar el código Haskell. Decidí usar GHC para analizar los tipos de fuente e inferir en lugar de escribir mi propio código para hacer eso. En este momento, estoy explorando los documentos de Haddock, pero es lento. ¿Alguien sabe de un buen tutorial?Necesito un tutorial para usar GHC para analizar y tipear Haskell

EDIT: Para aclarar, no estoy buscando algo como Hlint. Estoy escribiendo mi propia herramienta para analizar las características de tiempo de ejecución del código Haskell, por lo 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 As a library.

+3

¡Esta es una necesidad realmente importante! –

+0

@Adam ¿Has encontrado la respuesta todavía? También estoy trabajando en una aplicación similar. – Satvik

+0

¿Ha habido algún progreso en esto? Es una pregunta de hace 3 años, pero un tutorial como este es exactamente lo que estoy buscando. – jmite

Respuesta

9

Adam, este es un trineo muy duro. Desde su lanzamiento en 2006, la API de GHC ha sido poco documentada. Lo que recomendaría es intentar encontrar algunas aplicaciones pequeñas que se hayan escrito utilizando la API de GHC. El lugar correcto para preguntar es probablemente el GHC users' mailing list.

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

-1

El Haskell wiki y GHC documentation probablemente tiene lo que buscas si buscas los artículos. También una herramienta que podría interesarle es hlint, para verificar la sintaxis y otras cosas sobre su código fuente.

+1

Ya he buscado allí. "GHC como una biblioteca" (http://haskell.org/haskellwiki/GHC/As_a_library) es exactamente el tema sobre el que necesito información, pero la página es irremediablemente escasa. hlint no hace lo que quiero. –

10

¡Ah! encontrado un mejor punto de entrada en los documentos 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 la plataforma haskell, ghc-6.12.1.

errores: libdir está codificado. Ver ghc-paths arriba.

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

¿Tiene algún ejemplo de cómo proceder más? Me refiero a cómo compilar el CORE en binarios. –

1

Si el análisis es lo más importante, recomiendo haskell-src-exts. Analiza todo Haskell98, un montón de extensiones y es muy fácil de usar.

Cuestiones relacionadas