我有一个现有的Haskell函数,它使用GHC API从模块动态加载编译后的代码。它基于博客文章Dynamic Compilation and Loading of Modules in Haskell中的代码。
代码在GHC 7.0中运行良好,但必须稍微修改才能在GHC 7.2中编译,因为GHC API发生了变化。
代码现在在GHC 7.2中抛出运行时错误:
mkTopLevEnv: not a home module (module name):(function name)代码是
evalfuncLoadFFI String moduleName,
String externalFuncName,
String internalFuncName = do
result <- liftIO $ defaultRunGhc $ do
dynflags <- GHC.getSessionDynFlags
_ <- GHC.setSessionDynFlags dynflags
m <- GHC.findModule (GHC.mkModuleName moduleName) Nothing
--------------------------------------------------------
-- The following code works fine in GHC 7.0.4:
--
-- GHC.setContext [] [(m, Nothing)]
--
-- This new code attempts to set context to the module,
-- but throws an error in GHC 7.2:
--
(_,oi) <- GHC.getContext
GHC.setContext [m] oi
--------------------------------------------------------
fetched <- GHC.compileExpr (moduleName ++ "." ++ externalFuncName)
return (Unsafe.Coerce.unsafeCoerce fetched :: [LispVal] -> IOThrowsError LispVal)
defineVar env internalFuncName (IOFunc result)作为参考,可以在FFI.hs (github.com)中在线获得完整的代码。
有谁知道如何解决或解决这个问题吗?
另外,这可能是由GHC 7.2中新的安全Haskell变化引起的,还是仅仅是由于对GHC API的修改?
发布于 2012-02-11 17:42:55
https://stackoverflow.com/questions/9198140
复制相似问题