caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Anthony Tavener <anthony.tavener@gmail.com>
To: Francois Berenger <berenger@riken.jp>
Cc: "caml-list@inria.fr" <caml-list@inria.fr>
Subject: Re: [Caml-list] ANN: ocaml-ctypes, a library for calling C functions directly from OCaml
Date: Thu, 6 Jun 2013 20:06:24 -0600	[thread overview]
Message-ID: <CAN=ouMThn_+f99xKDAf051nGZ5Gcmic5w33RTR+mjS7jcLUUyA@mail.gmail.com> (raw)
In-Reply-To: <51B13721.1070101@riken.jp>

[-- Attachment #1: Type: text/plain, Size: 4500 bytes --]

"Too good to be true" is coming to mind now... because this looks
very nice. :) My TODO list has been getting choked up with "make
OCaml bindings for <some C lib>", but it's so unpleasant to do
(especially for libraries in development which you know will change).

Let's see how well this works...
Thanks, Jeremy!


On Thu, Jun 6, 2013 at 7:28 PM, Francois Berenger <berenger@riken.jp> wrote:

> 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<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<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<https://github.com/ocamllabs/ocaml-ctypes/wiki/ctypes-tutorial>
>> Examples:
>> https://github.com/ocamllabs/**ocaml-ctypes/tree/master/**examples<https://github.com/ocamllabs/ocaml-ctypes/tree/master/examples>
>> API documentation: http://ocamllabs.github.io/**ocaml-ctypes/<http://ocamllabs.github.io/ocaml-ctypes/>
>> Github repository: https://github.com/ocamllabs/**ocaml-ctypes<https://github.com/ocamllabs/ocaml-ctypes>
>> Direct download:
>> https://github.com/ocamllabs/**ocaml-ctypes/archive/ocaml-**
>> ctypes-0.1.tar.gz<https://github.com/ocamllabs/ocaml-ctypes/archive/ocaml-ctypes-0.1.tar.gz>
>>
>>
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa.inria.fr/sympa/**arc/caml-list<https://sympa.inria.fr/sympa/arc/caml-list>
> Beginner's list: http://groups.yahoo.com/group/**ocaml_beginners<http://groups.yahoo.com/group/ocaml_beginners>
> Bug reports: http://caml.inria.fr/bin/caml-**bugs<http://caml.inria.fr/bin/caml-bugs>
>

[-- Attachment #2: Type: text/html, Size: 5761 bytes --]

  reply	other threads:[~2013-06-07  2:06 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
2013-06-07  2:06   ` Anthony Tavener [this message]
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='CAN=ouMThn_+f99xKDAf051nGZ5Gcmic5w33RTR+mjS7jcLUUyA@mail.gmail.com' \
    --to=anthony.tavener@gmail.com \
    --cc=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;
as well as URLs for NNTP newsgroup(s).