Question

Je travaille sur un projet pour l'analyse du code Haskell. J'ai décidé d'utiliser GHC pour analyser la source et en déduire les types plutôt que d'écrire mon propre code pour le faire. En ce moment, je suis obstinés par la documentation Haddock, mais ça va lentement. Est-ce que quelqu'un sait d'un bon tutoriel?

EDIT: Pour clarifier, je ne cherche pas quelque chose comme hlint. J'écris mon propre outil pour analyser les caractéristiques d'exécution de code Haskell, il est donc comme j'écris un autre hlint. Ce que je suis à la recherche est essentiellement une extension de la page wiki GHC En tant que bibliothèque .

Était-ce utile?

La solution

Adam, cela est assez difficile traineaux. Depuis son lancement en 2006, l'API GHC a été quelque peu underdocumented. Ce que je recommande est d'essayer de trouver des petites applications qui ont été écrites en utilisant l'API GHC. Le bon endroit pour demander est probablement le liste de diffusion des utilisateurs GHC.

Un tel programme est ghctags, qui est livré avec l'arbre source GHC. J'ai écrit la version originale, mais je ne peux pas le recommande-il y a tellement de traces de pas sur le code que je ne peux suivre plus. Le mieux que je peux dire est que bien qu'il soit difficile à suivre, il est au moins petit et difficile à suivre beaucoup plus simple que tous GHC.

Autres conseils

Ah! trouvé un point d'entrée beaucoup mieux dans les docs à:    http://www.haskell.org /ghc/docs/latest/html/libraries/ghc-6.12.1/GHC.html

Je mis à jour le wikipage avec cet exemple:

Nous démontrons ici appeler parseModule, typecheckModule, desugarModule, getNamesInScope et getModuleGraph. Cela fonctionne pour haskell-plate-forme, GHC-6.12.1.

insectes: libdir est hardcoded. Voir chemins GHC-dessus.

--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 l'analyse syntaxique est la chose la plus importante, je vous recommande haskell-src-exts. Il analyse tous haskell98, un tas d'extensions et est très facile à utiliser.

Le Haskell wiki et hlint , pour vérifier la syntaxe et d'autres choses A propos de votre code source.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top