2015-10-03 34 views
7

Sonuç değerlendirmek ve yazdırmak için ghci'ye api aracılığıyla bir ifade göndermenin en basit örneği ne olurdu? Çalışacak tam bir örnek bulamıyorum. Evet, https://wiki.haskell.org/GHC/As_a_library'u denedim ancak çok fazla şey söylemeyen hatalar almaya devam ediyorum: no package state yet: call GHC.setSessionDynFlags. Hangi argümanlarla olursa olsun setSessionDynFlags'u veya setContext'u nerede denerim, her zaman bir hatayla sonuçlanırım. Şu anda (hayır setXYZ) var:GHC'yi kitaplık olarak kullanma

ben runGhc (Just libdir) çalıştırmak GHC ifadenin başına bu başlatma eklendiğinde kadar sorun çözüldü
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

Sen ilginizi çekebilir https : //hackage.haskell.org/package/hint – arrowd

+0

Teşekkürler, bu gerçekten çok ilginç görünüyor! :) – jakubdaniel

cevap

1

:

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