是否有可能在运行时检查OCaml中性能不佳的本机函数?这在混合C/OCaml项目中很有用.
在C中实现内部OCaml函数时,必须注意与运行时协调一致.
例如,在以下示例add中libadd故意不使用,CAMLreturn因为这是合适的.
(* foo.ml *)
external add : int -> int -> int = "add";;
Printf.printf "%d\n" (add 4 5);;
Run Code Online (Sandbox Code Playgroud)
和C源文件
// libadd.c
#include <caml/memory.h>
#include <caml/mlvalues.h>
CAMLprim value
add(value ml_x, value ml_y)
{
CAMLparam2(ml_x, ml_y);
long x = Long_val(ml_x);
long y = Long_val(ml_y);
// intentional mistake here
// don't use CAMLreturn
return Val_long(x + y);
}
Run Code Online (Sandbox Code Playgroud)
如果使用OCaml编译器编译此代码
$ ocamlopt foo.ml libadd.c
$ ocamlc -custom foo.ml libadd.c
Run Code Online (Sandbox Code Playgroud)
然后a.out只是打印9没有抱怨.
./a.out
9
Run Code Online (Sandbox Code Playgroud)
有没有办法让任何一个编译器围绕本机函数调用发出额外的检查,以检查是否已遵守OCaml调用约定?
ocaml对此问题没有任何作用,错误依赖于由gcc编译的C代码.并且gcc无法检查返回是否与Ocaml兼容.
可能是限制错误写入C的一种方法,Ocaml重新定义return以避免使用它:
#define return _forbidden_
Run Code Online (Sandbox Code Playgroud)
如果在代码中包含那些定义,那么您的初始C代码将无法编译.
它没有解决问题,但强制用户注意函数返回的方式可能很有用.
另一种方法是使用一个健全性脚本来检查返回类型CAML*不包含任何函数的任何函数return...