ctypes es una biblioteca para vincular a bibliotecas C utilizando OCaml puro. El objetivo principal es hacer que la escritura de extensiones C sea lo más sencilla posible.
El núcleo de ctypes es un conjunto de combinadores para describir la estructura de los tipos C: tipos numéricos, matrices, punteros, estructuras, uniones y funciones. Puede usar estos combinadores para describir los tipos de funciones que desea llamar y luego vincularlos directamente a esas funciones, ¡todo sin escribir ni generar ningún código C!
Supongamos que desea vincularse a las siguientes funciones de C:
int sigemptyset ( sigset_t * set );
int sigfillset ( sigset_t * set );
int sigaddset ( sigset_t * set , int signum );
int sigdelset ( sigset_t * set , int signum );
int sigismember ( const sigset_t * set , int signum );
Usando ctypes puede describir las interfaces para estas funciones de la siguiente manera:
let sigemptyset = foreign " sigemptyset " (ptr sigset_t @-> returning int )
let sigfillset = foreign " sigfillset " (ptr sigset_t @-> returning int )
let sigaddset = foreign " sigaddset " (ptr sigset_t @-> int @-> returning int )
let sigdelset = foreign " sigdelset " (ptr sigset_t @-> int @-> returning int )
let sigismember = foreign " sigismember " (ptr sigset_t @-> int @-> returning int )
Los nombres vinculados por este código tienen los tipos que cabría esperar:
val sigemptyset : sigset_t ptr -> int
val sigfillset : sigset_t ptr -> int
val sigaddset : sigset_t ptr -> int -> int
val sigdelset : sigset_t ptr -> int -> int
val sigismember : sigset_t ptr -> int -> int
Eso es todo lo que hay que hacer. A diferencia de la forma habitual de escribir extensiones de C, no hay funciones "stub" de C que escribir, por lo que hay muchas menos posibilidades de error.
La documentación y la distribución fuente contienen ejemplos más complejos, que involucran estructuras, uniones, matrices, funciones de devolución de llamada, etc., y muestran cómo crear y usar valores C (como instancias de sigset_t ptr
) en OCaml.
Cstubs_structs
para determinar de manera confiable el diseño de los datos.