From: Francois Berenger <berenger@riken.jp>
To: caml-list@inria.fr
Subject: Re: [Caml-list] ANN: ocaml-ctypes, a library for calling C functions directly from OCaml
Date: Fri, 07 Jun 2013 10:28:01 +0900 [thread overview]
Message-ID: <51B13721.1070101@riken.jp> (raw)
In-Reply-To: <CAAxsn=HAzLq6_jC5aTQ0rUFCiiVoKPJeiT2_m8+F0kyqFOS1EA@mail.gmail.com>
That looks very interesting!!!
How about the cost of exchanging values between C and OCaml?
Is there a trick in ocaml-ctypes like there is for bigarrays?
Regards,
F.
On 06/07/2013 08:17 AM, Jeremy Yallop wrote:
> I'm happy to announce the initial release of ocaml-ctypes.
>
> The ocaml-ctypes library makes it possible to call C functions
> directly from OCaml without writing or generating C code. The core of
> the library is a set of combinators for describing C types -- scalars,
> functions, structs, unions, arrays, and pointers to values and
> functions. Type descriptions can then be used to bind native
> functions and values. Here's a simple example:
>
> # let puts = foreign "puts" (string @-> returning int);;
> val puts : string -> int = <fun>
> # puts "Hello, world!";;
> Hello, world!
>
> Here's a more substantial example that shows how to describe a C
> structure type, map the type to an OCaml record, and call a function
> that returns the structure.
>
> (* Describe the C struct. There are two fields, both ints. *)
> let div_t = structure "div_t";;
> let q = div_t *:* int
> let r = div_t *:* int
> let () = seal div_t
>
> (* Define the OCaml record that we'll use to view the C structure. *)
> type div_result = { quot : int; rem: int }
>
> (* Define the conversions between the C struct and the OCaml record. *)
> let div_result_of_div_t d = { quot = getf d q; rem = getf d r }
> let div_t_of_div_result {quot; rem} =
> let d = make div_t in (setf d q quot; setf d r rem; d)
>
> (* Create a "view type" for that looks like div_result and behaves
> like div_t *)
> let div_result = view ~read:div_result_of_div_t
> ~write:div_t_of_div_result div_t
>
> (* Bind to the standard C `div' function *)
> let div = foreign "div" (int @-> int @-> returning div_result)
>
> (* Try it out *)
> # div 17 2;;
> - : div_result = {quot = 8; rem = 1}
>
> The distribution contains larger examples and a fairly extensive test
> suite, showing how to use other features of the library, such as
> binding to functions that accept callback arguments. Among the
> examples is Anil Madhavapeddy's port of the `curses' example from the
> OCaml documentation; it's instructive to compare the two
> implementations:
>
> OCaml manual curses example
> http://caml.inria.fr/pub/docs/manual-ocaml/manual033.html#toc147
>
> ocaml-ctypes curses example
> https://github.com/ocamllabs/ocaml-ctypes/blob/master/examples/ncurses/ncurses.ml
>
> Detailed installation instructions for ocaml-ctypes can be found in
> the tutorial. (Briefly: ensure libffi is installed, then 'opam
> install ctypes'.)
>
> Comments, bug reports, and other feedback are most welcome.
>
> Tutorial:
> https://github.com/ocamllabs/ocaml-ctypes/wiki/ctypes-tutorial
> Examples:
> https://github.com/ocamllabs/ocaml-ctypes/tree/master/examples
> API documentation: http://ocamllabs.github.io/ocaml-ctypes/
> Github repository: https://github.com/ocamllabs/ocaml-ctypes
> Direct download:
> https://github.com/ocamllabs/ocaml-ctypes/archive/ocaml-ctypes-0.1.tar.gz
>
next prev parent reply other threads:[~2013-06-07 1:28 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-06 23:17 Jeremy Yallop
2013-06-07 1:28 ` Francois Berenger [this message]
2013-06-07 2:06 ` Anthony Tavener
2013-06-07 8:16 ` Jeremy Yallop
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=51B13721.1070101@riken.jp \
--to=berenger@riken.jp \
--cc=caml-list@inria.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox