Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: Jeremy Yallop <yallop@gmail.com>
To: Caml List <caml-list@inria.fr>
Subject: [Caml-list] ANN: ocaml-ctypes, a library for calling C functions directly from OCaml
Date: Fri, 7 Jun 2013 00:17:47 +0100	[thread overview]
Message-ID: <CAAxsn=HAzLq6_jC5aTQ0rUFCiiVoKPJeiT2_m8+F0kyqFOS1EA@mail.gmail.com> (raw)

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

             reply	other threads:[~2013-06-06 23:17 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-06 23:17 Jeremy Yallop [this message]
2013-06-07  1:28 ` Francois Berenger
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='CAAxsn=HAzLq6_jC5aTQ0rUFCiiVoKPJeiT2_m8+F0kyqFOS1EA@mail.gmail.com' \
    --to=yallop@gmail.com \
    --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