Import Upstream version 20180207
[hcoop/debian/mlton.git] / doc / examples / ffi / export.sml
1 val e = _export "f": (int * real * char -> char) -> unit;
2 val _ = e (fn (i, r, _) =>
3 (print (concat ["i = ", Int.toString i,
4 " r = ", Real.toString r, "\n"])
5 ; #"g"))
6 val g = _import "g" public reentrant: unit -> unit;
7 val _ = g ()
8 val _ = g ()
9
10 val e = _export "f2": (Word8.word -> word array) -> unit;
11 val _ = e (fn w =>
12 Array.tabulate (10, fn _ => Word.fromLargeWord (Word8.toLargeWord w)))
13 val g2 = _import "g2" public reentrant: unit -> word array;
14 val a = g2 ()
15 val _ = print (concat ["0wx", Word.toString (Array.sub (a, 0)), "\n"])
16
17 val e = _export "f3": (unit -> unit) -> unit;
18 val _ = e (fn () => print "hello\n");
19 val g3 = _import "g3" public reentrant: unit -> unit;
20 val _ = g3 ()
21
22 (* This example demonstrates mutual recursion between C and SML. *)
23 val e = _export "f4": (int -> unit) -> unit;
24 val g4 = _import "g4" public reentrant: int -> unit;
25 val _ = e (fn i => if i = 0 then () else g4 (i - 1))
26 val _ = g4 13
27
28 val (_, zzzSet) = _symbol "zzz" alloc: (unit -> int) * (int -> unit);
29 val () = zzzSet 42
30 val g5 = _import "g5" public: unit -> unit;
31 val _ = g5 ()
32
33 val _ = print "success\n"