ctypes — это библиотека для привязки к библиотекам C с использованием чистого OCaml. Основная цель — сделать написание расширений C максимально простым.
Ядро ctypes — это набор комбинаторов для описания структуры типов C — числовых типов, массивов, указателей, структур, объединений и функций. Вы можете использовать эти комбинаторы для описания типов функций, которые вы хотите вызвать, а затем напрямую привязываться к этим функциям — и все это без написания или создания кода C!
Предположим, вы хотите привязаться к следующим функциям 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 );
Используя ctypes, вы можете описать интерфейсы этих функций следующим образом:
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 )
Имена, связанные этим кодом, имеют ожидаемые типы:
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
Вот и все. В отличие от обычного способа написания расширений C, здесь нет «заглушек» функций C, поэтому вероятность ошибки гораздо меньше.
Документация и исходный код содержат более сложные примеры, включающие структуры, объединения, массивы, функции обратного вызова и т. д., а также показывают, как создавать и использовать значения C (например, экземпляры sigset_t ptr
) в OCaml.
Cstubs_structs
для надежного определения расположения данных.