我想在 OCaml 和 C++ 之间架起一座桥梁。例如,我想在 C++ 中使用一些用 OCaml 编写的结构。
我怎样才能做到这一点?是否有任何库,绑定?
您应该阅读语言手册的相关部分:Interfacing C with OCaml。即使从本质上讲,它是非常详细的,也是非常低级的。
如果您不需要C++ 和 OCaml 代码之间的紧密通信(例如,您接口 GUI 代码和计算代码,但应用程序的计算密集型内核不会跨越应用程序边界,或者至少预计通信成本可以忽略不计与花费在任何一方的时间相比),我建议您探索更简单的方法,其中 C++ 和 OCaml 代码在单独的进程中运行,并通过消息传递交换信息(以最方便定义的任何格式:文本、s 表达式、二进制格式、JSON 等)。如果我确定更简单的方法不起作用,我只会尝试在同一过程中桥接代码。
编辑:自从我去年写了这个答案以来,Ctypes库出现了,来自 Jeremy Yallop;这是一种非常有前途的方法,可能比直接将 C 与 OCaml 接口简单得多。
最简单的方法是分两个步骤:OCaml → C,然后使用extern
关键字 C → C++。我在我的COH*ML项目中广泛执行此操作,该项目将 OCaml 与 C++ 中的Coherence库绑定。例如在 OCaml 我有:
type coh_ptr (* Pointer to a Cohml C++ object *)
external coh_getcache: string -> coh_ptr = "caml_coh_getcache"
然后在 C++ 中,首先是一个 C 函数:
extern "C" {
value caml_coh_getcache(value cn) {
CAMLparam1(cn);
char* cache_name = String_val(cn);
Cohml* c;
try {
c = new Cohml(cache_name);
} catch (Exception::View ce) {
raise_caml_exception(ce);
}
value v = caml_alloc_custom(&coh_custom_ops, sizeof(Cohml*), 0, 1);
Cohml_val(v) = c;
CAMLreturn(v);
}
}
最后是 C++ 实现:
Cohml::Cohml(char* cn) {
String::View vsCacheName = cn;
hCache = CacheFactory::getCache(vsCacheName);
}
反其道而行之,原理基本相同。