我一直在简要介绍Haskell的准引用库。这些库允许Haskell与其他语言集成。为了与C集成,似乎有两个具有类似功能的包:
由于我正在构建自己的准引用库,我对设计选择,API差异,性能等感兴趣。
我唯一知道的是language-c-quote
支持C和Objective-C,而inline-c
支持C。
您如何区分这些包裹?有什么根本区别?事实上它们是否相似?
答案 0 :(得分:8)
inline-c
's reddit announcement中讨论的(不久)讨论的一些差异:
这与language-c-inline相比如何?
- 在
inline-c
中,我们有一个非常简单的核心库,可以通过额外的反引号轻松扩展。我希望核心功能是非常可预测的,并且让更高级的编组人员可以使用特定的用例。在language-c-inline
中,编组使用硬编码规则和用户提供的模板Haskell函数。- 我们希望使语言尽可能简单地包含C代码。内联C拼接有准引号而没有模板Haskell函数。内联C代码指定使用反引号捕获的Haskell变量,目标类型都使用C语法指定。正如我在博客文章中所说,我非常关心这种情况,相信你在C中获得的是你所期望的。相关地,只检查反引号:C代码的其余部分未被解析并逐字删除,因此我们不必担心用户正在使用的C编译器与Haskell C解析器之间的最终不兼容性{{{ 1}}使用。
我们还确保基础架构和构建过程顺利进行。
language-c-inline
函数用于避免在运行时像addTopDecl
那样填充表,并且我还使用各种技巧来确保一切都能在整个构建中顺利运行。例如,生成的C函数的名称基于函数本身的内容的散列。这对于保证cabal重复构建同一文件非常重要 - 例如在使用分析支持进行编译时 - 会生成相同的C符号,同时确保仅当C片段符号相同时才符号相同在模块中是相同的。[...]
简而言之,这两个库在精神上非常相似,但我们将
language-c-inline
编码为更适合我们采用不同设计选择的需求。上面的一些优点可以轻松移植到inline-c
,尤其是最后一点。
announcement on fpcomplete还包含其他信息,但总而言之,它们有点类似。