问题标签 [ghc-api]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1268 浏览

haskell - 编译到 GHC 核心

我想为一种可以产生 GHC Core 的简单语言创建一个前端。然后我想获取这个输出并通过正常的 GHC 管道运行它。根据这个页面,不能直接从 ghc 命令。我想知道是否有任何方法可以做到这一点。

理想情况下,我期望对 ghc-api 进行一些函数调用,但我也愿意接受任何建议,包括(不那么广泛)在 GHC 源中进行黑客攻击。任何指针都会有所帮助!

0 投票
2 回答
3661 浏览

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

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

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

该代码现在在 GHC 7.2 中引发运行时错误:

代码是

作为参考,完整的代码可在FFI.hs (github.com)中在线获取。

有谁知道如何解决或解决这个问题?

另外,这可能是由 GHC 7.2 中的新 Safe Haskell 更改引起的,还是仅仅是由于对 GHC API 的修改?

0 投票
1 回答
2107 浏览

haskell - 如何处理“恐慌:不可能发生”并在 Haskell 中继续

我有以下代码使用 GHC API 加载模块并获取表达式的类型:

如果表达式不进行类型检查,则整个程序会崩溃:

我怎样才能使它不会使程序崩溃?我只想知道哪些表达式类型检查成功,哪些没有。

0 投票
0 回答
307 浏览

haskell - GHC API 动态加载是否仅适用于已安装包中的模块?

我尝试按照这个问题的答案中描述的方式进行操作。

我在工作目录中有ExampleModule.o文件ExampleModule.hi,我尝试加载ExampleModule.f函数。但我收到错误消息(详细级别设置为 3):

packageIdString (thisPackage dynflags)"main"。_

我想那是因为我只能从已安装的包中加载模块。我对吗?有没有办法从独立对象文件动态加载函数,就像load函数plugins一样,但使用 GHC API?

0 投票
1 回答
161 浏览

haskell - GHC-api 和类型检查类约束

我正在尝试使用 ghc-api 构建一个简单的类似 ghci 的控制台。我已经到了可以提取Type's 的表达式使用exprType和评估它们的地步。还有一种简单的方法可以检查表达式的类型是否具有给定类的实例?

编辑:似乎我正在寻找的功能需要一个InstEnv,但我不知道在哪里可以找到它。

0 投票
1 回答
397 浏览

haskell - 将一个模块具体化为一条记录

假设我有一个任意模块

其中foobarbaz正确实现等。

我想将此模块具体化为自动生成的数据类型和相应的对象:

名称必须与原始模块完全相同。

我可以手动完成,但这非常乏味,所以我想编写一些代码来为我执行此任务。

我不太确定如何处理这样的任务。模板 Haskell 是否提供了检查模块的方法?我应该挂钩一些 GHC api 吗?或者我是否也可以使用更特别的方法,例如刮黑线鳕页面?

0 投票
1 回答
110 浏览

haskell - 确定已加载目标的 ModuleName

我想知道您如何ModuleName使用 API 确定您刚刚在 ghc 中加载的文件。

如果您查看 API 的文档,他们总是假设您在加载文件之前知道模块名称。

我尝试对依赖图进行顶部排序并在那里选择最后一个模块,但这似乎并不总是返回加载的文件。

我之前能够做到的方法是修改 GHC 源代码以将此信息存储在HscEnv.

如果调用load返回它会很好,但肯定有办法做到这一点,因为 GHCi 在加载文件时知道这一点。

0 投票
1 回答
613 浏览

haskell - 使用 GHC API 时查找 cabal 包

我正在尝试制作一个使用 GHC API 为我检查 haskell 文件的程序。我已经获得了适用于本地文件的类型检查,但我有一个特定的 cabal 包,我也需要它可用(这个可执行文件将属于同一个包)。如何添加此导入依赖项?

我还尝试使用 ghc 命令行编译来解决这个问题,ghc -package PKG-VER --make Test.hs -v但它似乎只在本地目录中查找导入。

我当前的代码如下所示:

0 投票
1 回答
632 浏览

haskell - Haskell GHC 动态编译仅适用于第一次编译

遵循此处发布的 GHC 教程,并按照我之前提出的堆栈溢出问题中的建议对此代码进行了更改,我创建了一个程序,该程序能够在 Test.hs 中编译和运行模块,并使用函数 print 打印字符串到屏幕:

如评论中所述,此代码的问题在于它似乎仅在您第一次运行时才有效(当尚未编译 Test.hs 时)。如果您再次尝试运行该代码,则会出现以下错误:

我相信这与代码已经编译的事实有关。如果我删除 .hi 和 .o 文件并再次运行该程序,则该程序会以正确的输出正确运行。我错过了什么?我目前正在使用 ghc 版本 7.4.1

(注意:我尝试过查看 GHC API,但找不到对 mkTopLevEnv 的任何引用)

0 投票
1 回答
293 浏览

haskell - 将字符串视为 Haskell 程序

作为一个更大的大学项目的一小部分,我需要编写一个本质上非常粗糙的 IDE。这个想法是从 gtk 文本框中获取输入,将该字符串视为在 .hs 文件中,并评估其中的函数。

我的主要方法是使用GHC API来编译和评估测试函数。我已经设法获得了一个用于从 .hs 文件编译的玩具示例。GHC 的 Target 数据类型有一个用于从 StringBuffer 获取目标的可选构造函数,因此我决定尝试更改我的代码以使其从 String Buffer 中工作:

以下代码当时在文本框中:

但是,这似乎不起作用。我得到错误:

我究竟做错了什么?我觉得我严重误解了这段代码的工作方式。

向我建议的这种方法的替代方法是使用提示或 mueval 之类的方法来评估文本框中的文本。如果我只是想单独评估一个函数,这似乎可以正常工作,但是如果我想评估一个依赖于运行同一源文件中定义的 4 个其他函数的上下文的函数,这会扩展吗?