繁体   English   中英

是否可以将 C function 作为回调传递给 OCaml?

[英]Is it posible to pass a C function as callback to OCaml?

我正在研究如何将 OCaml TCP/IP 堆栈集成到我的 C++ 项目中。 由于这个答案,我已经知道如何从 OCaml 调用 C 并从 C 调用 OCaml: OCaml as C library,hello world

OCaml 将由 C++ 控制,而不是相反。 因此,对于 TCP/IP 堆栈,我必须能够发送和接收数据包。 我可以通过 C++ 轻松地将数据发送到 TCP/IP 堆栈,但是如何接收呢? 我需要将 C function(回调)作为参数传递给 OCaml,以便它在数据到达时传递数据。 可能吗?

为此,您需要两个 C 函数。 第一个(下面的wrap_fun )是从 C 代码中调用的。 它需要一个 C 回调并返回一个 OCaml 值,然后您可以将其传递给您的 OCaml 代码。 第二个(下面的call_wrapped )是从 OCaml 代码中调用的。 它采用由第一个 function 创建的 OCaml 值并调用存储在其中的回调。

您没有指定有关回调签名的任何内容,因此下面的代码适用于value(value)

#include <caml/alloc.h>
#include <caml/memory.h>
#include <caml/mlvalues.h>

typedef value (*cb)(value);

value wrap_fun(cb f) {
  value v = caml_alloc_small(1, Abstract_tag);
  Field(v, 0) = (value)f;
  return v;
}

value call_wrapped(value f, value x) {
  CAMLparam2(f, x);
  cb g = (cb)Field(f, 0);
  value z = g(x);
  CAMLreturn(z);
}

在 OCaml 方面,它看起来如下:

external call_wrapped : ('a, 'b) wrapped_fun -> 'a -> 'b  = "call_wrapped"

let foo f x =
  let y = x + 1 in
  let z = call_wrapped f y in
  z ^ "a"

call_wrapped中的CAMLparam2CAMLreturn宏仅用于教学目的。 它们可以安全地移除,因为 function 只是实际 function 的包装。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM