特に、Allegroゲームライブラリへのバインディングを作成することで、Haskellの外部関数インターフェイスを学習しようとしています。AllegroのネイティブCでは、メインイベントループは次のようになります。
// initialize event struct
ALLEGRO_EVENT event;
// main loop
while (running) {
if (al_get_next_event(event_queue, &event)) {
// process event here ...
}
}
ghcとhsc2hsを使用して、次のような外部関数呼び出しを記述できます。
foreign import ccall "allegro5/allegro.h al_get_next_event"
alGetNextEvent :: EventQueue -> Ptr (Event) -> IO (CInt)
ここEventQueue
で、は不透明な構造へのポインタであり、Event
はStorable
Cに基づくインスタンスですALLEGRO_EVENT
。
理想的には、ユーザー向けのHaskell関数については、次のような型署名が必要です。
getNextEvent :: EventQueue -> Maybe Event
ALLEGRO_EVENT
これは、構造体とブール値の戻り値の初期化を抽象化します。
私の質問は、メモリ効率を最大化するためにこの関数をどのように書くべきかということです。メソッド内への新しいポインターをmallocしてEvent
使用することもできますが、Cベースのデータを使用しているため、既存のスペースを再利用し、常に新しい構造体を割り当てないようにします。また、ユーザーが構造体をmallocして、すべての呼び出しに渡すことを避けたいと思います。
何かアドバイス?