Работает и для C, просто измените инструкции по компиляции:
say_something.ml:
let say_something string = String.concat "" ["OCaml says: "; string]
let () = Callback.register "say_something" say_something
say_something. cc:
#include <stdio.h>
#include <string.h>
#include <caml/mlvalues.h>
#include <caml/callback.h>
#include <caml/alloc.h>
char *say_something(const char *s)
{
static const value *say_something_closure = NULL;
if (say_something_closure == NULL) {
say_something_closure = caml_named_value("say_something");
if (say_something_closure == NULL) {
std::exit(1);
}
}
value str = caml_alloc_initialized_string(strlen(s), s);
/* We copy the C string returned by String_val to the C heap
so that it remains valid after garbage collection. */
return strdup(String_val(caml_callback(*say_something_closure, str)));
}
основной. cc:
#include <stdio.h>
#include <caml/callback.h>
extern char* say_something(const char* s);
int main(int argc, char ** argv)
{
char* result;
/* Initialize OCaml code */
caml_startup(argv);
/* Do some computation */
result = say_something("hello world\n");
printf("%s", result);
return 0;
}
Как построить:
ocamlopt -output-obj -o s.o say_something.ml
g++ -o hello_world -I $(ocamlopt -where) \
main.cc say_something.cc s.o $(ocamlopt -where)/libasmrun.a -ldl