2015-10-03 7 views
7

Was wäre das einfachste Beispiel für das Senden eines Ausdrucks an ghci über seine API zur Auswertung und zum Ausdrucken des Ergebnisses? Ich kann kein vollständiges Beispiel finden, das funktionieren würde. Ja, ich habe versucht https://wiki.haskell.org/GHC/As_a_library, aber ich bekomme immer Fehler, die mir nicht viel sagen: no package state yet: call GHC.setSessionDynFlags. Wo auch immer ich setSessionDynFlags mit irgendwelchen Argumenten oder setContext versuche, habe ich immer einen Fehler. Ich habe zur Zeit (kein setXYZ):Verwenden von GHC als Bibliothek

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

Sie könnten daran interessiert sein https : //hackage.haskell.org/package/hint – arrowd

+0

Danke, das scheint wirklich sehr interessant! :) – jakubdaniel

Antwort

1

Also mein Problem wurde gelöst, als ich diese Initialisierung am Anfang des GHC Ausdruck hinzugefügt, die ich mit runGhc (Just libdir) laufen:

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