【问题标题】:ccall import of emscripten export in GHCJS在 GHCJS 中调用 emscripten 导出的导入
【发布时间】:2018-04-02 18:08:59
【问题描述】:

我正在尝试使用 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',...,...)

但我被类型不匹配难住了。

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

【问题讨论】:

    标签: javascript c haskell emscripten ghcjs


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多