我正在尝试使用ghcjs将haskell库minisat移植到JavaScript,以便集成到更大的haskell-ghcjs项目中。

minisat包含几个从c库导入的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)
the documentation来看,我的理解是,当emscripten导出接受或返回指针的函数时,该指针将成为JavaScript数字类型。

ghcjs documentation建议通过适当地包装JavaScript函数,可以将现有的国外进口留在原地。但是,ghcjs将指针类型大致表示为一对,由JavaScript对象和数字组成。

我认为包装器代码应该大致

function h$minisat_solve(...){
   ...
   minisat_solve(...)
   ...
}

function minisat_solve = Module.cwrap('minisat_solve',...,...)

但是我对类型不匹配感到困惑。

因此,这是一个挑战:使用上述包装器代码作为示例(或反示例,如果我完全错了),说明如何正确包装通过ccall导入ghcjs的Emscripten导出。

最佳答案

指针类型可以与整数相互转换:https://hackage.haskell.org/package/base-4.10.0.0/docs/Foreign-Ptr.html#t:IntPtr。因此,您应该能够将emscripten要求的那些格式使用这些功能转换为任何格式。

07-24 18:51