ctypes ist eine Bibliothek zur Bindung an C-Bibliotheken mithilfe von reinem OCaml. Das Hauptziel besteht darin, das Schreiben von C-Erweiterungen so einfach wie möglich zu gestalten.
Der Kern von ctypes ist eine Reihe von Kombinatoren zur Beschreibung der Struktur von C-Typen – numerische Typen, Arrays, Zeiger, Strukturen, Unions und Funktionen. Mit diesen Kombinatoren können Sie die Typen der Funktionen beschreiben, die Sie aufrufen möchten, und dann direkt an diese Funktionen binden – und das alles, ohne C zu schreiben oder zu generieren!
Angenommen, Sie möchten eine Bindung zu den folgenden C-Funktionen herstellen:
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 );
Mit ctypes können Sie die Schnittstellen zu diesen Funktionen wie folgt beschreiben:
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 )
Die durch diesen Code gebundenen Namen haben die Typen, die Sie vielleicht erwarten:
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
Das ist alles. Anders als bei der üblichen Art, C-Erweiterungen zu schreiben, müssen keine C-„Stub“-Funktionen geschrieben werden, sodass die Fehleranfälligkeit deutlich geringer ist.
Die Dokumentation und die Quellverteilung enthalten komplexere Beispiele, darunter Strukturen, Unions, Arrays, Rückruffunktionen usw., und zeigen, wie C-Werte (wie Instanzen von sigset_t ptr
) in OCaml erstellt und verwendet werden.
Cstubs_structs
-Modul verwenden, um das Datenlayout zuverlässig zu bestimmen