我正在尝试使用 ghcjs 将 haskell 库minisat 移植到 JavaScript,以便集成到更大的 haskell-ghcjs 项目中。
minisat 包含几个来自 ac 库的 ffi 导入。我已经设法使用 emscripten 将 c 库编译为 javascript,并导出 minisat 所需的函数。到目前为止,一切都很好。
但是,有几个导入看起来像这样:
foreign import ccall safe minisat_solve :: Solver -> Int -> Ptr (Lit) -> IO (Bool)
它导入了一个如下所示的函数:
int minisat_solve(minisat_solver *s, int len, minisat_Lit *ps)
我从文档中的理解是,当 emscripten 导出一个接受或返回指针的函数时,指针变成了 JavaScript 数字类型。
ghcjs文档建议应该可以通过适当地包装一个 JavaScript 函数来保留现有的外部导入。但是,ghcjs 将指针类型大致表示为由 JavaScript 对象和数字组成的一对。
我认为包装代码应该大致
function h$minisat_solve(...){
...
minisat_solve(...)
...
}
function minisat_solve = Module.cwrap('minisat_solve',...,...)
但我对类型不匹配感到困惑。
所以,这里的挑战是:解释如何正确地包装一个 emscripten 导出为ccall
import by ghcjs
,使用上面的包装器代码作为一个例子(或者一个反例,如果我完全错了)