动态加载编译的 Haskell 模块 - GHC 7.6

2024-06-18

我正在尝试使用 GHC API 动态编译和加载 Haskell 模块。我知道 API 从一个版本到另一个版本波动很大,所以我专门谈论 GHC 7.6.*。

我尝试在 MacOS 和 Linux 上运行相同的代码。在这两种情况下,插件模块都可以正常编译,但在加载时会出现以下错误:Cannot add module Plugin to context: not interpreted

问题类似于this https://stackoverflow.com/questions/12790341/haskell-ghc-dynamic-compliation-only-works-on-first-compile其中,只有在主机程序的同一运行中编译该模块时,才会加载该模块。

-- Host.hs: compile with ghc-7.6.*
-- $ ghc -package ghc -package ghc-paths Host.hs
-- Needs Plugin.hs in the same directory.
module Main where

import GHC
import GHC.Paths ( libdir )
import DynFlags
import Unsafe.Coerce

main :: IO ()
main =
    defaultErrorHandler defaultFatalMessager defaultFlushOut $ do
      result <- runGhc (Just libdir) $ do
        dflags <- getSessionDynFlags
        setSessionDynFlags dflags
        target <- guessTarget "Plugin.hs" Nothing
        setTargets [target]
        r <- load LoadAllTargets
        case r of
          Failed    -> error "Compilation failed"
          Succeeded -> do
            setContext [IIModule (mkModuleName "Plugin")]
            result <- compileExpr ("Plugin.getInt")
            let result' = unsafeCoerce result :: Int
            return result'
      print result

和插件:

-- Plugin.hs
module Plugin where

getInt :: Int
getInt = 33

问题是你正在使用IIModule。这表明您希望将模块及其中的所有内容(包括未导出的内容)引入上下文中。它本质上是一样的:loadGHCi 中带有星号。正如您所注意到的,这仅适用于解释代码,因为它可以让您“查看”模块内部。

但这不是您在这里需要的。你想要的是加载它,就像你使用过一样:module or an import声明,适用于已编译的模块。为此,您使用IIDecl您可以使用它进行进口申报simpleImportDecl:

setContext [IIDecl $ simpleImportDecl (mkModuleName "Plugin")]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态加载编译的 Haskell 模块 - GHC 7.6 的相关文章

  • 为什么 exceptT 没有 MonadMask 实例?

    爱德华 克梅特例外情况图书馆不提供单子掩码 https www stackage org haddock lts 7 18 exceptions 0 8 3 Control Monad Catch html t MonadMask实例为Ex
  • Haskell 排列库函数 - 请澄清一下?

    这是代码permutationsHaskell 中的函数Data List module permutations a gt a permutations xs0 xs0 perms xs0 where perms perms t ts i
  • 如何使用 Haskell 提交 html 表单

    我知道如何使用http 管道 http hackage haskell org package http conduit 2 1 0包的 simplehttp 从 URL 检索页面 现在如果那样的话怎么办 网页有一个输入文本字段和一个提交按
  • Haskell 类型定义,=> 等

    我正在使用 Learn You a Haskell 来学习 Haskell 第 54 页上有一个 像这样执行 take Num i Ord i gt i gt a gt a take n n lt 0 take take n x xs x
  • 没有由文字“1”产生的 Num String 实例

    main do putStrLn myLast 1 2 3 4 myLast a gt a myLast x x myLast xs myLast xs 当我尝试运行此代码时 我收到此消息 没有由文字 1 产生的 Num String 实例
  • 如何处理或避免BlockedIndefinitelyOnSTM异常?

    我花了很多时间来解决我正在处理的应用程序中遇到的问题 该应用程序是一个 Web 应用程序 使用 scotty 公开 REST 端点 它使用一个TVar保持其更新的状态STM a由前端层触发的动作 由于该应用程序基于事件溯源原则 因此业务层生
  • Haskell cabal:我刚刚安装了软件包,但现在找不到软件包

    在这里 http haskell org haskellwiki Cabal Install I just installed packages 2C but now the packages are not found这是我可以找到我正在
  • Haskell 中实例声明的参数顺序切换

    我想进行实例声明 但自由类型变量不是最后一个变量 例如 我有一个类声明 class Poppable m where tryPop m a gt Maybe a m a 现在我想让 Q PSQ 优先级队列 成为 Poppable 的实例 具
  • 是否有适用于 Haskell 或 Scala 等函数式语言的 LL 解析器生成器?

    我注意到明显缺乏用函数式语言创建解析器的 LL 解析器 我一直在寻找但没有成功的理想发现是为 ANTLR 风格的 LL 语法生成 Haskell 解析器 语法的模小数重新格式化 并且令我惊讶的是 每个最后一个解析器生成器都具有函数我发现的语
  • 用纯函数式语言保持状态

    我正在尝试弄清楚如何执行以下操作 假设您正在开发直流电机的控制器 您希望让它以用户设置的特定速度旋转 def set point ref sp 90 while true let curr read speed controller set
  • 不明白这个 haskell 代码中的内容

    我有一些 Haskell 代码 我正在尝试完成它 但我不明白其中发生了什么 type Bag a a gt Int emptyB Bag a emptyB e gt 0 countB Eq a gt Bag a gt a gt Int co
  • 如何在 GHCJS 程序中定期执行操作?

    应该有人使用setInterval通过Javascript 或者使用一些更惯用的基于线程的解决方案 Using setInterval posed 一些挑战 https stackoverflow com questions 3357661
  • 如何从有向无环图导出FRP?

    我目前正在研究我的下一个项目 目前处于预规划阶段 因此这个问题只是为了了解现有技术的概述 Setup 我有一个具有多个输入和输出的有向无环图 DAG 现在考虑人工神经网络 处理这种结构的常见方法是在每个 时间 步骤上处理整个网络 我相信这是
  • Haskell 中是否可以部分应用第 n 个参数?

    我很好奇是否可以写一个函数apply nth它接受一个函数 参数的数量以及该参数的值 然后返回一个新的 部分应用的函数 我的感觉是 由于类型系统的原因 这是不可能的 但我无法给出令人满意的答案 我也无法提出工作类型签名 如果语言的类型更加松
  • 不明确的类型变量

    相关我之前关于遍历数据结构的问题 https stackoverflow com questions 1855371 avoiding boilerplate when dealing with many unrelated types 当
  • Haskell 中的随机枢轴快速排序

    是否有可能在 Haskell 中实现快速排序 使用 RANDOM PIVOT 但仍然有一个简单的Ord a gt a gt a 签名 我开始了解 Monad 目前 我将 monad 解释为某种 命令模式 这对于 IO 非常有用 所以 我知道
  • 自动函子实例

    给定以下代数类型 ghci gt data Foo a Foo a 然后我实例化其中之一 ghci gt let f Foo foo 最后 我想打电话给fmap将函数应用为 a gt b gt Foo a gt Foo b ghci gt
  • 关注点分离:什么时候最好将语义与语法分离?

    Choices 类型类的出色之处在于它们允许我们将额外的结构连接到现有类型 从而使我们能够推迟一些设计决策 而不是在构思时匆忙做出决定 另一方面 例如 在面向对象编程中 我们被迫考虑类型需要立即执行什么操作 以及稍后出现的或需要的任何附加结
  • Haskell 程序查找列表中元素的位置

    我需要编写一个函数来查找列表中一个特定元素的位置 我是这样写的 findPos list elt list 1 head list elt 0 otherwise 1 findPos tail list elt 但是如果列表中元素重复怎么办
  • Haskell 中的纯函数是否有可能改变变量的本地副本?

    Haskell 中的纯函数是否有可能改变变量的本地副本 就像 clojure 中提到的那样函数式编程是一个骗局 http swannodette github io 2013 06 10 porting notchs minecraft d

随机推荐

  • 当CSS文件存在时,无法在服务器上找到它们[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 当运行本地服务器时 这一切都运行良好 我有 header html 其中包含以下代码 在 public html 目录 与 header h
  • 设置滚动条粗细

    有没有办法调整滚动条的粗细JScrollPane 默认值有点笨拙 一个快速但又肮脏的解决方案是将宽度 高度明确设置为例如10 像素通过 jScrollPane getVerticalScrollBar setPreferredSize ne
  • 如何关闭 HTML 输入表单字段建议?

    我所说的建议是指当您开始输入时会出现下拉菜单 并且它的建议基于您之前输入的内容 例如 当我在标题字段中输入 a 时 它会给我大量的建议 这非常烦人 如何关闭此功能 你想要的是禁用 HTMLautocomplete属性 在这里设置 autoc
  • Python 3d 金字塔

    我是 3D 绘图新手 我只想用 5 个点建造一个金字塔并通过它切出一个平面 我的问题是我不知道如何填充两侧 points np array 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 fig plt figure ax fi
  • iphone sdk - 调用视图的超级视图的视图控制器的方法

    你好 我如何在当前视图中调用当前视图的超级视图的视图控制器中实现的方法 你能帮我吗 谢谢 通常这是通过代表完成的 让您的视图接口定义一个协议和对某个委托的引用 然后让你的父视图控制器实现这个协议 然后父母会这样做 someView fooD
  • 使用“presentModalViewController”加载视图

    我正在尝试从另一个视图控制器加载临时的滑入视图 我的应用程序的视图控制器的结构如下 Application gt Tab Bar Controller gt TabBarItem gt View Controller 在此视图控制器中 我有
  • 我的 Visual Studio 2008 模板有什么问题?

    我正在尝试为 Visual Studio 创建自己的类模板 称为 公共类 我跟着有关如何手动创建项目模板的官方 MSDN 说明 http msdn microsoft com en us library ms247113 aspx几乎一字不
  • UILocalNotification 播放自定义声音

    我在我的应用程序中实现了本地通知 但我只是想知道是否有一种方法可以播放不属于 iPhone 应用程序主包的一部分的声音 基本上在我的应用程序中 我希望用户录制生成本地通知时播放的声音 而不是播放预先录制的或默认的声音 据我所知 这是可以实现
  • 数组所有可能的组合

    我有一个字符串数组 ted williams golden voice radio 我希望这些关键字的所有可能组合采用以下形式 ted williams golden voice radio ted williams ted golden
  • 如何通过API网关从lambda正确返回二进制文件(图像)

    这是我的 lambda exports handler async event gt const hex 89504e470d0a1a0a0000000d49484452000000a0000000a00800000000aea438f10
  • 如何将curlpp 添加到我的项目中?

    我正在尝试从 vb net 过渡到 C 但我陷入了困境 我从下载了curpp这给了我一个 dll exp 和 lib 文件 我将包含这 3 个文件的目录添加到项目属性中的 附加库目录 链接器 gt 常规 接下来 我将 ws2 32 lib
  • Artifactory OSS 源代码位于哪里?

    我可以下载最新的 Artifactory OSS 版本 5 2 1 但我似乎找不到它的源代码 Artifactory 文档链接到https api bintray com content jfrog artifactory jfrog ar
  • UITextField 在模拟器中崩溃,但在 iPhone 4 (4.2) 中则不然

    我面临一个奇怪的问题 不知道如何解决 我的应用程序中有一个带有 3 个文本字段的简单视图控制器 我已在 h 中将它们定义为 IBOutlet 并将它们与文件的所有者链接起来 其中两个使用默认键盘定义 另一个使用手机键盘键盘 当我尝试编辑电话
  • Anaconda:ModuleNotFoundError:没有名为“conda”的模块

    请注意 此错误与 stackoverflow 中显示的错误 并有答案 不同 它绝对不是重复的 我以前见过这个错误 并且能够通过修改 PATH 以包含 conda 的路径来修复它 如下所示 export PATH opt cloudera p
  • 使用 node-sass 监视整个目录时指定输出文件名

    目前 我可以在查看单个 SCSS 文件时使用 package json 文件中的 node sass build 命令指定文件名 sass build node sass src scss main scss dist css main m
  • 为什么删除void*是UB而不是编译错误?

    为什么要通过删除对象void 是未定义的行为 而不是编译错误 void foo void p delete p 这段代码编译并生成代码 尽管有关于 gcc 和 clang 的警告 令人惊讶的是 ICC 没有给出警告 2 5 warning
  • 使用 QGraphicsScene 和 QGraphicsView 在 Qt 中开始基于 Tile 的游戏

    我将开始在 Qt 中编写基于 2D 图块的游戏 并阅读 QGraphicsScene 和 QGraphicsView 类 这些类旨在显示和处理大量 2D 对象 我的问题是 使用 QGraphicsScene 创建一个包含大量图块的世界是否可
  • (int *)0 是空指针吗?

    这可以被认为是一个扩展这个问题 https stackoverflow com q 16563114 912144 我只对 C 感兴趣 但添加 C 来完成扩展 C11 标准 6 3 2 3 3 规定 值为 0 的整数常量表达式 或此类表达式
  • 通过django s3中间件保存文件时获取Http403(但可以在shell中使用boto保存)

    我一直在尝试通过 django 应用程序将用户上传的文件保存到我的 s3 存储桶中 我正在使用django s3 storage https github com etianen django s3 storage中间件 但我不断收到 S3
  • 动态加载编译的 Haskell 模块 - GHC 7.6

    我正在尝试使用 GHC API 动态编译和加载 Haskell 模块 我知道 API 从一个版本到另一个版本波动很大 所以我专门谈论 GHC 7 6 我尝试在 MacOS 和 Linux 上运行相同的代码 在这两种情况下 插件模块都可以正常