gpt4 book ai didi

haskell - 是否可以不透明地将 Haskell 嵌入到 C 库中?

转载 作者:行者123 更新时间:2023-12-03 13:34:45 34 4
gpt4 key购买 nike

即是否可以将 Haskell 代码嵌入 C 库中,以便库的用户不必知道 Haskell 正在使用?特别是,这样用户可以使用多个嵌入 Haskell 的库,而不会发生任何冲突?

据我了解,您嵌入了对 hs_init 和 hs_exit 的调用之间,但这些涉及全局状态恶作剧,应该与其他调用冲突,不是吗?

最佳答案

是的,它是 possible通过 FFI 从 C 调用 Haskell 代码(反之亦然),Foreign Function Interface .不幸的是,作为 haskell.org docs说,你不能避免调用初始化和完成haskell环境:

The call to hs_init() initializes GHC's runtime system. Do NOT try to invoke any Haskell functions before calling hs_init(): bad things will undoubtedly happen.



但是, this也很有趣:

There can be multiple calls to hs_init(), but each one should be matched by one (and only one) call to hs_exit()



furthermore :

The FFI spec requires the implementation to support re-initialising itself after being shut down with hs_exit(), but GHC does not currently support that.



基本上我的想法是你可以利用这个规范来为自己编写一个包装 C++ 类来管理对 hs_init 的调用。和 hs_exit对你来说,例如使用由 hs_init 包围的模板方法和 hs_exit你可以使用任何你想要的haskell调用来覆盖它。
但是,请注意与调用 haskell 代码的其他库的交互:对 hs_init 的嵌套调用层和 hs_exit应该没问题(所以使用在包装器之间调用它们的库是安全的),但是调用的总数应该始终匹配,这意味着如果这些库只初始化环境而不尝试关闭它,那么由你决定完成工作。

另一个(可能更好)的想法 ,不利用继承和覆盖,可能是有一个简单的类 HaskellEnv调用 hs_init在构造函数和 hs_exit在析构函数中。如果您将它们声明为自动变量,您将获得对 hs_init 的调用。和 hs_exit将始终匹配,最近一次调用 hs_exit将尽快制作最新的 HaskellEnv当您离开其范围时,对象将被破坏。
看看 this question为了防止在堆上创建对象(在这种情况下它们可能很危险)。

关于haskell - 是否可以不透明地将 Haskell 嵌入到 C 库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11137443/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com