我正在考虑在新应用程序中使用OCaml和C代码之间的组合。似乎从Ocaml调用C代码很简单:
external name : type = C-function-name
然而,似乎另一方面(从C调用OCaml)更复杂:
static void
call_ocaml_void (const char * name)
{ CAMLparam0 () ;
CAMLlocal1 (ostr) ;
ostr = caml_copy_string (name);
value * func = caml_named_value ("ocaml_puts") ;
if (func == NULL)
puts ("caml_named_value failed!") ;
else
caml_callback (*func, ostr) ;
CAMLreturn0 ;
} /* call_ocaml_void */
(来自此page的示例)
尤其是涉及复制。
有人能告诉我是否可以允许从这两种语言访问数据结构?因此,函数只能传递指向结构的指针,但无论如何两种语言都可以读取它。
目标是使用OCaml执行所有操作,然后以有效的方式将数据传递到C环境。
谢谢!
答案 0 :(得分:3)
首先,您可以将任何C malloced值作为抽象类型传递给ocaml。他们有几个问题:
您还可以使用包含指向任何内容的指针的自定义块。这也是一个bastract值(如前面的情况),但你可以添加一些代码,当自定义块被GCs时,它将被调用,并将负责释放C对象。
然后对于整数/ char / float数组,你有biggaray库“一个已经分配的C或Fortran数组的指针p可以被包装并使用alloc_bigarray作为一个大数组返回到Caml 或alloc_bigarray_dims函数。 “见the manual