CのプログラムからOCamlの関数を呼び出す

Callbackモジュールを使う。

foo.ml

let f x = x+1;

let _ = Callback.register "Foo.f" f

main.c

#include <caml/mlvalues.h>
#include <caml/callback.h>

int f(int i) {
  value * f = caml_named_value("Foo.f");
  return Int_val(callback(*f, Val_int(i));
}

int main(int argc, char *argv[]) {
  caml_startup(argv);
  printf("f(%d) = %d\n", 3, f(3));
  return 0;
}

コンパイル

$ ocamlc -output-obj -o foo.o foo.ml
$ ocamlc -o main.o main.c
$ gcc -o foo main.o foo.o -L /usr/lib/ocaml -Icamlrun -lm -ldl -lcurses
$ ./foo
f(3) = 4

詳しくは、マニュアルを読むこと。

マニュアルには、

$ gcc -o foo main.o foo.o -L /usr/lib/ocaml -Icamlrun

と書いてあるが、これではいろいろ足りなくて文句を言われる。2時間くらい悩んだ*1。あと、camlの方でPrintf.printfとかしても出力されない。なんなんだろ。

shared libraryは今度試す。

※return抜けまくり。修正修正。

*1:なにやってんだ...orz