ein Tutorial benötigt GHC für die Verwendung von Haskell zu analysieren und typecheck

StackOverflow https://stackoverflow.com/questions/2242986

  •  19-09-2019
  •  | 
  •  

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 .

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top