问题标签 [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 回答
586 浏览

c - 是否可以在运行时生成和运行 TemplateHaskell 生成的代码?

是否可以在运行时生成和运行 TemplateHaskell 生成的代码?

在运行时使用 C,我可以:

  • 创建函数的源代码,
  • 调用 gcc 将其编译为 .so (linux)(或使用 llvm 等),
  • 加载 .so 和
  • 调用函数。

模板 Haskell 是否可以做类似的事情?

0 投票
1 回答
241 浏览

debugging - 为什么 GHC 中直接导入的函数与我用从 GHC 库复制的源代码编写的函数有很大不同

问题1:这filter是从 的库中复制GHC的,但是为什么它消耗越来越多的内存直接导入的相比filter,它消耗的内存数量是恒定的。

问题2:这个filter是从库里复制过来GHC的,但是为什么和直接使用的一样消耗越来越多的内存,和直接导入的相比,消耗的内存越来越多。elemfilter

GHC 版本:7.4.2 操作系统:Ubuntu 12.10 编译 -O2 优化

正如上面的filterandelem的定义所暗示的, p = filter (==1000000000000) [0..]ands = 1000000000000 `elem` [0..][0..]应该逐渐被垃圾回收。但两者都p消耗s越来越多的内存。而r其中定义的直接导入filter会消耗一定数量的内存。

我的问题是为什么 GHC 中直接导入的函数与我使用从 GHC 库复制的源代码编写的函数有很大不同。我想知道GHC是否有问题?

我还有一个问题:上面的代码是从我写的一个项目中抽象出来的,这个项目也面临着“消耗越来越多的内存,理论上应该是垃圾回收”的问题。所以我想知道有没有办法找到 GHC 中哪个变量占用了这么多内存。

感谢您的阅读。

0 投票
1 回答
309 浏览

haskell - 推断包含 Haskell 表达式的字符串的类型

我需要一种(快速而肮脏的)方法来获得以字符串形式给出的 Haskell 表达式类型的某种表示。

我目前看到 3 个选项:

  • 使用 GHC API——然而,文档很快让我失去了兴趣。
  • 使用其他类型推断工具——有人建议我尝试使用 haskell-type-exts,但除了最简单的表达式之外,它无法输入所有内容。我不知道任何其他这样的工具。
  • 滚动我自己的 HM 推断器——除非绝对必要,否则我会避免这种情况

我什至不需要一个完整的解决方案,因为可以键入 Haskell 的合理基本子集的库/工具对我来说就足够了。

那么实现这一目标的最简单方法是什么?

0 投票
1 回答
1113 浏览

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

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

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

该问题与此问题类似,其中模块仅在主机程序的同一运行中编译时才会加载。

和插件:

0 投票
1 回答
173 浏览

haskell - Language.Haskell.Interpreter - 如何正确调用 IO 操作?

按照示例文件,我尝试动态调用 IO 操作。

不幸的是,该字符串"some string"从未被打印出来。我也尝试调用writeFile,但也没有创建文件。

那么需要什么来实现这些副作用呢?谢谢!

0 投票
1 回答
689 浏览

haskell - 我可以在运行时从字符串编译haskell函数(使用插件)吗?

我有一个应用程序,由于各种原因,我需要运行任意的用户提供的代码。(SafeHaskell 使这变得既好又安全)。我查看了插件包,它非常适合从光盘上的 .hi 文件加载。

但是,对于我的程序设计,如果我可以将这些用户程序存储在数据库中,然后直接将它们编译为我可以在我的程序中使用的函数,那将是理想的选择。

因此,如果我正在编译的函数具有以下类型:

我正在寻找一些可以从字符串生成该函数的函数:

其中 string 包含“someFunction”的 haskell 代码。

有谁知道是否有办法做到这一点,最好使用插件包?我遇到了一点 GHC API,但我不太了解它以及它与此有何关系。

请注意,我尝试过提示,但它不适合我的应用程序,因为它不是线程安全的。

0 投票
1 回答
224 浏览

haskell - 使用 GHC API 进行代码编译的“试运行”

我正在为 Haskell 开发一个相当简单的文本编辑器,我希望能够在用户点击“检查”时突出显示代码中的静态错误。

有没有办法使用 GHC-API 来“试运行”编译 haskell 文件而不实际编译它?我希望能够获取一个字符串并进行正常编译的所有检查,但没有输出。GHC-API 将是理想的,因为这样我就不必解析 GHC 的命令行输出来突出显示错误等。

此外,是否可以对字符串而不是文件进行此检查?(如果没有,我可以把它写到一个临时文件中,这不是非常有效,但可以工作)。

如果这是可能的,您能否提供或指出一个示例如何做到这一点?

这个问题问的是同样的问题,但它来自三年前,当时的答案是“GHC-API 是新的,还没有好的文档”。所以我希望状态已经改变。

编辑:“空运行”限制是因为我在基于 Web 的设置中执行此操作,其中编译发生在服务器端,所以我想避免每次用户点击“检查”时不必要的磁盘读/写。无论如何,可执行文件都会被丢弃,直到他们准备好运行的版本。

0 投票
0 回答
339 浏览

haskell - Haskell全程序静态分析的实现技巧

作为基于属性测试的研究项目的一部分,我需要对 Haskell 程序进行静态全程序分析。我正在寻找有关如何对 Haskell 程序进行整体程序分析的建议,希望自己不需要构建大量基础设施。

我查看了 Template Haskell,它具有我需要的许多功能,但缺少一个关键特性:在 GHC 中实现的 Template Haskell 中,似乎无法通过 name 获取函数的定义。(相关的 SO 问题:How to get the declaration of a function using `reify`?

我怀疑可能有某种方法可以使用 GHC API 对 Haskell 程序进行全程序分析,但我无法从 GHC API 文档中轻松确定如何完成。

特别是,给定一个函数调用站点,我需要能够查找相应的函数定义。我对基于模板 Haskell 或 GHC API 的解决方案特别感兴趣。

有没有办法在不自己构建所有基础设施的情况下对 Haskell 程序进行整个程序分析?

0 投票
1 回答
182 浏览

haskell - ghc-mtl 无法使用 ghc-7.8 构建

我正在尝试使用 ghc-7.8.3 构建 ghc-mtl-1.2.1.0 并且收到以下错误消息:

与 ghc-7.8.2 相同的错误。

我试图找出 9000 多个类型和/或模块中的哪一个被称为Ghc和/或GHC和/或MonadIO 对此负责,但到目前为止还没有运气。

所以我的问题是:

  • 造成这种破损的原因是什么变化?
  • 是否可以在不从 7.8.3 降级的情况下修复它?
0 投票
0 回答
80 浏览

haskell - 在 GhcMonad 中运行 Q Exp

我正在寻找与此类似的东西:

文档:GhcMonadQ ExpDynamic

我正在寻找组合我的两个代码示例的方法;一种用于动态评估haskell 代码,另一种用于使用模板haskell 动态组合haskell。换句话说,在 GhcMonad 中运行 Q 表达式:表达式。

我会解决这个问题,我应该在这里记录。

一些想法

我目前发现可行的方法是将表达式序列化并将其输入到动态评估中。序列化必须以某种方式在 Q monad 内部完成。我也许可以使用 Exp 实现Ppr prettyprinter类。但是,我可能会以这种方式失去一些类型安全性?可能有更清洁(更卫生”?)的方式。我应该更多地研究 Data.Dynamic以了解动态值的工作原理。

编辑:我现在意识到 Dynamic 只代表值,而我想运行 Q Exp 'declarations'。我想将数据类型添加到动态上下文中。