Hai bisogno di un tutorial per l'utilizzo di GHC per analizzare e TYPECHECK Haskell

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

  •  19-09-2019
  •  | 
  •  

Domanda

Sto lavorando su un progetto per analizzare il codice Haskell. Ho deciso di usare GHC per analizzare la fonte e inferire i tipi piuttosto che scrivere il mio codice per fare questo. In questo momento, sto slogging attraverso la documentazione Haddock, ma è lento andare. Qualcuno sa di un buon tutorial?

EDIT: Per chiarire, non sto cercando qualcosa di simile hlint. Sto scrivendo il mio strumento per analizzare le caratteristiche di esecuzione di codice Haskell, quindi è come sto scrivendo un hlint diverso. Quello che sto cercando è fondamentalmente un ampliamento della pagina wiki GHC come libreria .

È stato utile?

Soluzione

Adam, questo è slittino piuttosto difficile. Fin dal suo lancio nel 2006, l'API GHC è stato un po 'underdocumented. Quello che mi sento di raccomandare è quello di cercare di trovare alcune piccole applicazioni che sono state scritte utilizzando l'API GHC. Il posto giusto per porsi è probabilmente il mailing lista utenti GHC .

Uno di questi programmi è ghctags, fornito con l'albero dei sorgenti GHC. Ho scritto la versione originale, ma non posso consiglio-ci sono tante impronte sul codice che non riesco più a seguirla. La cosa migliore che posso dire è che anche se è difficile da seguire, è almeno piccolo e difficile da seguire, molto più semplice di tutti GHC.

Altri suggerimenti

Ah! trovato un migliore punto di ingresso nella documentazione a:    http://www.haskell.org /ghc/docs/latest/html/libraries/ghc-6.12.1/GHC.html

Ho aggiornato il WikiPage con questo esempio:

Qui mostriamo chiamare parseModule, typecheckModule, desugarModule, getNamesInScope e getModuleGraph. Questo funziona per Haskell-platform, GHC-6.12.1.

bug: libdir è hardcoded. Vedere GHC-percorsi sopra indicati.

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

Se l'analisi è la cosa più importante, vi consiglio di Haskell-src-exts. Si analizza tutti Haskell98, un mucchio di estensioni ed è molto facile da usare.

Il Haskell wiki e documentazione GHC ha probabilmente quello che stai cercando, se si cerca per gli articoli. Anche uno strumento che potrebbe essere interessato a IS hlint , per la verifica della sintassi e altre cose circa il vostro codice sorgente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top