Browse thread
Wrapping OCaml function returning a variant
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2007-03-28 (12:37) |
From: | Serge Aleynikov <serge@h...> |
Subject: | Re: [Caml-list] Wrapping OCaml function returning a variant |
Joel Reymont wrote: > > On Mar 28, 2007, at 1:55 PM, Serge Aleynikov wrote: > >> You can read the section 18.3.4 of >> http://caml.inria.fr/pub/docs/manual-ocaml/manual032.html > > It does not clearly explain how to handle variant types in C code. Maybe > I'm dumb but I did not understand it. > >> Then if still unclear, examine: http://oracaml.sourceforge.net/ >> or any other C-interface library available on Caml Hump: >> http://caml.inria.fr/cgi-bin/hump.en.cgi?sort=0&browse=65 > > It looks like you are using polymorphic variants in new syntax. Maybe > I'm wrong but it doesn't work for me > > # type foo = [Null | Int of int];; > Syntax error That's because this code is written using revised (http://caml.inria.fr/pub/docs/tutorial-camlp4/tutorial005.html) syntax. These are not polymorphic variants but rather a basic union type with non-constant constructors. Hint: you can start the ocaml toplevel like this to get it understand revised syntax: "ocaml camlp4r.cma". > I still don't understand how I can handle regular variants of the > following type returned by OCaml to the C side In terms of your example above, on the C side you would do: void bar(value foo) { if (Is_long(foo)) { switch (Long_val(foo)) { case 0: /* Null */ ... break; /* if there are other constant constructors besides Null add additional cases here */ default: fail_exception(Long_val(foo), "Unknown constant constructor!"); } } else { switch (Tag_val(foo)) { case 0: /* Int of int */ /* Access the non-constant value by Long_val(Field(foo,0))) */ break; ... } } } Regards, Serge