ocaml ctypes
ocaml-ctypes 0.21.1
ctypes は、純粋な OCaml を使用して C ライブラリにバインドするためのライブラリです。主な目的は、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 の「スタブ」関数を記述する必要がないため、エラーが発生する可能性が大幅に低くなります。
ドキュメントとソース配布には、構造体、共用体、配列、コールバック関数などを含むより複雑な例が含まれており、OCaml で C 値 ( sigset_t ptr
のインスタンスなど) を作成および使用する方法を示しています。
Cstubs_structs
モジュールを使用してデータ レイアウトを確実に決定する方法を示します。