2017-10-21 41 views
4

我試圖使用ghcjs將haskell庫minisat移植到JavaScript,以便集成到更大的haskell-ghcjs項目中。ccall導入emscripten導出在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包裝一個emscripten出口爲ccall進口,使用上述包裝代碼爲例(或反例,如果我完全錯了的話)

回答