按照发布的 GHC 教程here http://www.bluishcoder.co.nz/2008/11/dynamic-compilation-and-loading-of.html并按照以下建议对此代码进行更改我之前问过的一个堆栈溢出问题 https://stackoverflow.com/questions/12779143/dynamic-compilation-in-haskell-ghc-api-error,我创建了一个程序,它能够编译并运行 Test.hs 中的模块,并使用 print 函数将字符串打印到屏幕上:
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 的引用)
西蒙·马洛建议here http://www.haskell.org/pipermail/glasgow-haskell-users/2011-October/021009.html那个替换
guessTarget "Test.hs" Nothing
with
guessTarget "*Test.hs" Nothing
应该避免您遇到的错误,因为它告诉 GHC 不要加载 .o 文件。
See the 通过 nabble 在页面上显示整个线程 http://haskell.1045720.n5.nabble.com/mkTopLevEnv-not-interpreted-main-Main-td4861327.html
当然,您可以每次都删除 .hi 和 .o 文件,但这是一个丑陋的解决方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)