特别是,我正在尝试通过编写与 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)
whereEventQueue
是指向不透明结构的指针,并且Event
是Storable
基于 C 的实例ALLEGRO_EVENT
。
理想情况下,对于面向用户的 Haskell 函数,我希望有一个类型签名,例如
getNextEvent :: EventQueue -> Maybe Event
这将抽象出初始化ALLEGRO_EVENT
结构和布尔返回值。
我的问题是,我应该如何编写这个函数来最大化内存效率?我可以Event
在方法内部分配一个新指针并使用它,但由于我正在处理基于 C 的数据,我想确保我正在重新使用现有空间而不是不断分配新结构。我还想避免让用户 malloc 结构并将其传递给每个调用。
有什么建议吗?