使用 GHC 作为库
Using GHC as library
通过 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
所以当我在 GHC
表达式的开头添加这个初始化时我的问题就解决了 运行 with runGhc (Just libdir)
:
df <- getSessionDynFlags
setSessionDynFlags $ df { hscTarget = HscInterpreted
, ghcLink = LinkInMemory
}
setContext $ map (IIDecl . simpleImportDecl . mkModuleName) [ "Prelude" ]
通过 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
所以当我在 GHC
表达式的开头添加这个初始化时我的问题就解决了 运行 with runGhc (Just libdir)
:
df <- getSessionDynFlags
setSessionDynFlags $ df { hscTarget = HscInterpreted
, ghcLink = LinkInMemory
}
setContext $ map (IIDecl . simpleImportDecl . mkModuleName) [ "Prelude" ]