从C检查OCaml类型签名

从C检查OCaml类型签名,c,ocaml,C,Ocaml,假设我有一个OCaml函数 let _ = register "cbf_coh_insert" (fun k v -> print_endline ("Inserted key=" ^ k ^ " value=" ^ v)) 这是一个接受两个参数的函数。在C端,我用caml_callback2(*caml_named_value(“cbf_coh_insert”),k,v)来调用它。在C端,是否有方法检查参数的数量(本例中为2个)是否匹配?除了我想打电话给它并试图诱捕一个SIGSEGV。

假设我有一个OCaml函数

let _ = register "cbf_coh_insert" (fun k v -> print_endline ("Inserted key=" ^ k ^ " value=" ^ v))
这是一个接受两个参数的函数。在C端,我用
caml_callback2(*caml_named_value(“cbf_coh_insert”),k,v)来调用它。在C端,是否有方法检查参数的数量(本例中为2个)是否匹配?除了我想打电话给它并试图诱捕一个SIGSEGV。谢谢

更新:。

无WAI

应在编译时确保这一点(手动或通过代码生成,或通过解析和检查C和OCaml代码是否同步)

更新

寄存器功能示例:

let on_cbf_coh_insert (f : string -> string -> unit) = register "cbf_coh_insert" f
更新

我希望有可能将闭包/let绑定直接传递到C

你为什么认为这是不可能的?查看一直在执行此操作的现有绑定


顺便说一句,这个问题是一个完美的例子。

我想防止意外注册一个更新回调函数(它有3个参数,key,old value和new value,我用
caml\u callback3
调用C)作为插入,例如。我打算将C位作为OCaml用户不需要触摸的“黑匣子”提供。制作特殊的OCaml函数以注册具有适当类型的回调我想到了这一点,但请记住,我们将函数名作为字符串文本。OCaml编译器无法“看到”该字符串的内容与代码中函数的实际名称之间的关联,您可以在任何名称下注册任何函数。该名称可以是任何名称,我可能希望注册多个插入函数(在不同的一致性缓存上)。“cbf_coh_insert”这个名字不应该硬编码,这是我的目标。