使用GHC作为库

jak*_*iel 7 api haskell ghci

通过api将表达式发送到ghci进行评估和打印结果的最简单的例子是什么?我无法找到一个可行的完整示例.是的,我已经尝试了https://wiki.haskell.org/GHC/As_a_library,但我一直收到的错误并没有告诉我多少:no package state yet: call GHC.setSessionDynFlags.无论我setSessionDynFlags在哪里尝试任何参数,或者setContext,我总是以错误结束.我目前有(不setXYZ):

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
Run Code Online (Sandbox Code Playgroud)

jak*_*iel 1

GHC因此,当我在运行的表达式的开头添加此初始化时,我的问题得到了解决runGhc (Just libdir)

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