我正在尝试使用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 number类型。
ghcjs documentation建议,通过适当地包装JavaScript函数,应该可以保持现有的外部导入不变。但是,ghcjs将指针类型表示为大致由JavaScript对象和数字组成的一对。
我认为包装器代码应该大致是
function h$minisat_solve(...){
...
minisat_solve(...)
...
}
function minisat_solve = Module.cwrap('minisat_solve',...,...)但是我被类型不匹配给难住了。
因此,这里有一个挑战:解释如何使用上面的包装器代码作为示例(或者反例,如果我完全错误的话),如何正确地包装用于ghcjs的ccall导入的emscripten导出。
发布于 2017-11-28 11:22:35
指针类型可以与integers:https://hackage.haskell.org/package/base-4.10.0.0/docs/Foreign-Ptr.html#t:IntPtr相互转换。因此,您应该能够使用这些函数将emscripten需要的任何格式转换为emscripten格式。
https://stackoverflow.com/questions/46868261
复制相似问题