即是否可以将Haskell代码嵌入到C库中,以便库的用户不必知道正在使用Haskell?特别是,这样用户可以使用多个嵌入Haskell的库,而不会有任何冲突?
据我所知,你在hs_init和hs_exit的调用之间嵌入,但这些涉及全局状态恶作剧,应该与其他调用冲突,不是吗?
Ric*_* T. 14
是的,可以通过FFI(外部函数接口)从C调用Haskell代码(反之亦然).不幸的是,正如haskell.org文档所说,你无法避免调用初始化和最终确定haskell环境:
对hs_init()的调用初始化了GHC的运行时系统.在调用hs_init()之前不要尝试调用任何Haskell函数:毫无疑问会发生坏事.
但是,这也很有趣:
可以对hs_init()进行多次调用,但是每次调用都应该与对hs_exit()的一次(并且只有一次)调用相匹配
而另外:
FFI规范要求实现支持在使用hs_exit()关闭后重新初始化,但GHC目前不支持.
基本上,我的想法是,你可以利用此规格为了youself编写管理调用一个包装C++类hs_init,并hs_exit通过使用模板四周方法你,例如在hs_init和hs_exit您可以覆盖使用调用任何你想要的哈斯克尔.但是,要注意与调用haskell代码的其他库的交互:嵌套的调用层hs_init并且hs_exit应该没问题(所以使用在包装器之间调用它们的库是安全的),但是调用的总数应该始终匹配,这意味着如果这些库只是初始化环境而不试图关闭它,然后由你来完成这项工作.
另一个(可能更好)的想法,没有利用继承和重写,可能是一个简单的类HaskellEnv,hs_init在构造函数和hs_exit析构函数中调用.如果将它们声明为自动变量,您将获得对hs_init和hs_exit将始终匹配的调用,并且当您离开其范围时hs_exit,一旦最新HaskellEnv对象被破坏,将进行最新调用.看看这个问题是为了防止在堆上创建对象(在这种情况下它们可能很危险).