The last time Hackerfall tried to access this page, it returned a not found error. A cached version of the page is below, or click here to continue anyway

Calling OCaml from Objective-C on the iPhone - Edgar Aroutiounian

Now I'll show you an example of calling OCaml from Objective-C. Much of this code will have simplifications as its an example for getting you started. Also note that dealing at the C level and the OCaml runtime can be tricky and is not for beginners.

Here's the OCaml code first, assume it is named

1: let make_string () =
2:   print_endline "Hello Word from OCaml";
3:   "Hello World "
5: let () =
6:   Callback.register "make_string" make_string

We're essentially telling the runtime to make this function available to grab as a handle, in this case it's a handle on a closure.

And now the Objective-C code, assume it is named main.c

 1: #define CAML_NAME_SPACE
 3: #import <Foundation/Foundation.h>
 5: #include <caml/callback.h>
 6: #include <caml/mlvalues.h>
 8: int main (int argc, char **argv)
 9: {
10:   caml_startup(argv);
11:   caml_callback(*caml_named_value("make_string"), Val_unit);
12:   NSLog(@"Now using objective-c code");
13:   return 0;
14: }

Its important to call caml_startup before any OCaml callbacks. Then we get a handle on the closure and call it with unit.

To compile this code you'll need the cross-compiler which was installed by following the directions on my opam-ios repo, the command you use is:

$ ocamloptrev -rev 8.3 -ccopt -ObjC -cclib '-framework Foundation' main.c -o F

The 8.3 is the iOS SDK you want to link against, again see the README on the github repo for opam-ios for more details.

The output we get, F is an arm executable, when we run it on the iPhone we will get an output of:

$ some_iphone :~/  ./F
Hello Word from OCaml
2016-01-23 22:44:04.889 F[1977:507] Now using objective-c code


Continue reading on