首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GHC API -如何使用GHC 7.2从编译的模块动态加载Haskell代码?

GHC API -如何使用GHC 7.2从编译的模块动态加载Haskell代码?
EN

Stack Overflow用户
提问于 2012-02-09 01:11:04
回答 1查看 3.6K关注 0票数 24

我有一个现有的Haskell函数,它使用GHC API从模块动态加载编译后的代码。它基于博客文章Dynamic Compilation and Loading of Modules in Haskell中的代码。

代码在GHC 7.0中运行良好,但必须稍微修改才能在GHC 7.2中编译,因为GHC API发生了变化。

代码现在在GHC 7.2中抛出运行时错误:

代码语言:javascript
复制
mkTopLevEnv: not a home module (module name):(function name)

代码是

代码语言:javascript
复制
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的修改?

EN

回答 1

Stack Overflow用户

发布于 2012-02-11 17:42:55

试一试

代码语言:javascript
复制
GHC.setContext [] [(m,Nothing)]

(来自another StackOverflow question)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9198140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档