ein Tutorial benötigt GHC für die Verwendung von Haskell zu analysieren und typecheck
Frage
Ich arbeite an einem Projekt für Haskell-Code zu analysieren. Ich beschloss, GHC zu verwenden, um die Quelle und schließen Typen anstatt schreibe meine eigenen Code zu analysieren, das zu tun. Gerade jetzt, ich bin slogging durch die Haddock docs, aber es wird langsam voran. Kennt jemand ein gutes Tutorial?
EDIT: Um zu klären, ich bin nicht auf der Suche nach so etwas wie hlint. Ich schreibe mein eigenes Werkzeug, um die Laufzeiteigenschaften von Haskell-Code zu analysieren, so ist es, wie ich ein anderes hlint ich schreibe. Was ich suche ist im Grunde eine Erweiterung der Wiki-Seite GHC Als Bibliothek .
Lösung
Adam, das ist ziemlich hart Rodeln. Seit seiner Einführung im Jahr 2006 hat das GHC API etwas underdocumented worden. Was würde ich empfehlen, ist zu versuchen, einige kleine Anwendungen zu finden, die GHC API geschrieben wurden, verwenden. Der richtige Ort zu fragen, ist wahrscheinlich die GHC Benutzer Mailingliste .
Ein solches Programm ist ghctags
, die Schiffe mit dem GHC Quellbaum. Ich schrieb die ursprüngliche Version, aber ich kann es-es nicht empfehlen, so viele Abdrücke auf dem Code, dass ich es nicht mehr folgen kann. Das Beste, was ich sagen kann, ist, dass, obwohl es schwer ist, zu folgen, ist es zumindest kleine und schwer zu Folge viel einfacher als alle GHC.
Andere Tipps
Ah! zu einem viel besseren Einstieg in die Dokumentation gefunden: http://www.haskell.org /ghc/docs/latest/html/libraries/ghc-6.12.1/GHC.html
Ich aktualisiere die Wikiseite mit diesem Beispiel:
Hier zeigen wir nennen parseModule, typecheckModule, desugarModule, getNamesInScope und getModuleGraph. Dies funktioniert für Haskell-Plattform, GHC-6.12.1.
Fehler: libdir ist fest einprogrammiert. Siehe ghc-Pfade oben.
--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!"
Wenn das Parsen das Wichtigste ist, empfehle ich haskell-src-exts. Es analysiert alle Haskell98, einen ganzen Haufen von Erweiterungen und ist sehr einfach zu bedienen.
Die Haskell Wiki und hlint , zur Überprüfung der Syntax und andere Dinge über den Quellcode.