根据GHC教程发布here并根据a previous stack overflow question I asked中的建议对此代码进行了更改,我创建了一个程序,可以在Test.hs中编译和运行带有函数打印的模块将字符串打印到屏幕上:
import GHC
import GHC.Paths
import DynFlags
import Unsafe.Coerce
main :: IO ()
main =
defaultErrorHandler defaultLogAction $ do
func <- runGhc (Just libdir) $ do
dflags <- getSessionDynFlags
setSessionDynFlags dflags
target <- guessTarget "Test.hs" Nothing
addTarget target
r <- load LoadAllTargets
case r of
Failed -> error "Compilation failed"
Succeeded -> do
m <- findModule (mkModuleName "Test") Nothing
setContext [IIModule m]
value <- compileExpr ("Test.print")
do let value' = (unsafeCoerce value) :: String -> IO ()
return value'
func "Hello"
return ()
如评论中所述,此代码的问题在于它似乎只在您第一次运行时才起作用(当Test.hs尚未编译时)。如果您尝试再次运行代码,则会出现以下错误:
mkTopLevEnv: not interpreted main:Test
我认为这与代码已经编译的事实有关。如果我删除.hi和.o文件并再次运行程序,程序将以正确的输出正确运行。我错过了什么?我目前正在使用ghc版本7.4.1
(注意:我试过查看GHC API,但找不到对mkTopLevEnv的任何引用)
答案 0 :(得分:2)
Simon Marlow建议here替换
guessTarget "Test.hs" Nothing
与
guessTarget "*Test.hs" Nothing
应该避免你得到的错误,理由是它告诉GHC不要加载.o文件。
请参阅whole thread on a page via nabble
当然,您每次都可以删除.hi和.o文件,但这是一个难看的解决方法。