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