È possibile definire le proprie funzioni C per allocare, liberare, inserire, rimuovere, ecc. Queste funzioni possono racchiudere il contenitore C++ a cui si desidera accedere. Per esempio:
extern "C" {
Obj * obj_create()
{
return new Obj();
}
void obj_destroy(Obj * schema)
{
delete obj;
obj = NULL;
}
...
...
}
poi dichiarare in FFI e avvolgerli in qualsiasi modo si desidera.
data SomeObject
type Obj = Ptr SomeObject
foreign import ccall unsafe "obj_create"
createObj :: IO Obj
foreign import ccall unsafe "obj_destroy"
destroyObj_ :: Obj -> IO()
foreign import ccall unsafe "&obj_destroy"
destroyObj :: FunPtr (Obj -> IO())
alcuni grattacapi:
- Assicurati di compilare i file C con un compilatore C++ (g ++ al posto di gcc). questo assicurerà che le librerie stdC++ vengano rilevate correttamente.
- Far passare le posizioni delle librerie (-L) e librerie (-lboost *) per collegare in quando si compila il programma/lib sul lato Haskell
Avete bisogno di modificare i singoli elementi sul lato Haskell? –
@JohnL, no, chiama semplicemente le funzioni con esse, ad es. 'do {a <- cpp_getVector(); forM a cpp_f} 'where' cpp_f :: ElementType -> IO() ' – gatoatigrado