我試圖使用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
進口,使用上述包裝代碼爲例(或反例,如果我完全錯了的話)