小编Gra*_*use的帖子

GHCJS 中 ccall 导入 emscripten 导出

我正在尝试使用 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',...,...)
Run Code Online (Sandbox Code Playgroud)

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

ccall因此,挑战如下:使用ghcjs上面的包装器代码作为示例(或者反例,如果我完全错误的话)解释如何正确包装 emscripten 导出以供导入

javascript c haskell emscripten ghcjs

5
推荐指数
1
解决办法
121
查看次数

标签 统计

c ×1

emscripten ×1

ghcjs ×1

haskell ×1

javascript ×1