我正在尝试使用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要求的那些格式使用这些功能转换为任何格式。