Macro ocaml_interop::ocaml [−][src]
macro_rules! ocaml {
() => { ... };
($vis : vis fn $name : ident($arg : ident : $typ : ty $(,) ?) $(-> $rtyp : ty)
? ; $($t : tt) *) => { ... };
($vis : vis fn $name :
ident($arg1 : ident : $typ1 : ty, $arg2 : ident : $typ2 : ty $(,) ?)
$(-> $rtyp : ty) ? ; $($t : tt) *) => { ... };
($vis : vis fn $name :
ident($arg1 : ident : $typ1 : ty, $arg2 : ident : $typ2 : ty, $arg3 : ident :
$typ3 : ty $(,) ?) $(-> $rtyp : ty) ? ; $($t : tt) *) => { ... };
($vis : vis fn $name : ident($($arg : ident : $typ : ty), + $(,) ?)
$(-> $rtyp : ty) ? ; $($t : tt) *) => { ... };
}
Expand description
Declares OCaml functions.
ocaml! { pub fn registered_name(arg1: ArgT, ...) -> Ret_typ; ... }
declares a function that has been
defined in OCaml code and registered with Callback.register "registered_name" ocaml_function
.
Visibility and return value type can be omitted. The return type defaults to ()
when omitted.
When invoking one of these functions, the first argument must be a &mut
OCamlRuntime
,
and the remaining arguments OCamlRef
<ArgT>
.
The return value is a BoxRoot
<RetType>
.
Calls that raise an OCaml exception will panic!
. Care must be taken on the OCaml side
to avoid exceptions and return ('a, 'err) Result.t
values to signal errors, which
can then be converted into Rust’s Result<A, Err>
and Result<OCaml<A>, OCaml<Err>>
.
Examples
ocaml! {
// Declares `print_endline`, with a single `String` (`OCamlRef<String>` when invoked)
// argument and `BoxRoot<()>` return type (default when omitted).
pub fn print_endline(s: String);
// Declares `bytes_concat`, with two arguments, an OCaml `bytes` separator,
// and an OCaml list of segments to concatenate. Return value is an OCaml `bytes`
// value.
fn bytes_concat(sep: OCamlBytes, segments: OCamlList<OCamlBytes>) -> OCamlBytes;
}