[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Fwd: [Caml-list] ANN: ocaml-ctypes, a library for calling C functions directly from OCaml



Begin forwarded message:

> From: Jeremy Yallop <yallop@xxxxxxxxx>
> Subject: [Caml-list] ANN: ocaml-ctypes, a library for calling C functions 
> directly from OCaml
> Date: 7 June 2013 00:17:47 BST
> To: Caml List <caml-list@xxxxxxxx>
> 
> 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
> 
> -- 
> Caml-list mailing list.  Subscription management and archives:
> https://sympa.inria.fr/sympa/arc/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
> 




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.