2015-10-03 12 views
7

Quale sarebbe l'esempio più semplice di invio di un'espressione a ghci tramite la sua API per la valutazione e la stampa del risultato? Non sono in grado di trovare un esempio completo che funzioni. Sì, ho provato https://wiki.haskell.org/GHC/As_a_library ma continuo a ricevere errori che non mi dicono molto: no package state yet: call GHC.setSessionDynFlags. Ovunque cerco setSessionDynFlags con qualsiasi argomento, o setContext, finisco sempre con un errore. Al momento ho (non setXYZ):Utilizzo di GHC come libreria

import GHC 
import GHC.Paths (libdir) 
import GhcMonad 
import Debugger 
import DynFlags 
import Outputable 
import Language.Haskell.HsColour 
import Language.Haskell.HsColour.Colourise 

colour :: String -> String 
colour = hscolour TTY defaultColourPrefs True True "" False 

ghci :: IO() 
ghci = runGhc (Just libdir) $ do 
    r <- runStmt "[1, 2, 3]" RunToCompletion 
    case r of 
     RunOk ns -> do 
      mapM_ (\n -> do 
        mty <- lookupName n 
        case mty of 
         Just (AnId id) -> do 
          t <- obtainTermFromId maxBound True id 
          fl <- getSessionDynFlags 
          liftIO $ putStrLn $ colour $ show $ withPprStyleDoc fl defaultUserStyle $ ppr t 
          return() 
         otherwise -> return() 
       ) ns 
     otherwise -> return() 

main :: IO() 
main = ghci 
+2

potreste essere interessati a https : //hackage.haskell.org/package/hint – arrowd

+0

Grazie, sembra davvero molto interessante! :) – jakubdaniel

risposta

1

Quindi il mio problema è stato risolto quando ho aggiunto questa inizializzazione all'inizio del GHC espressione che ho eseguito con runGhc (Just libdir):

df <- getSessionDynFlags 
setSessionDynFlags $ df { hscTarget = HscInterpreted 
         , ghcLink = LinkInMemory 
         } 
setContext $ map (IIDecl . simpleImportDecl . mkModuleName) [ "Prelude" ]