
On Tue, Jun 16, 2009 at 10:48:19AM -0300, Maurício wrote:
/*****/ struct ex { int x; int y; int z; };
ex example_functions (ex p) { (...) } /*****/
You may adopt the approach I used with Hipmunk[1] where there is a wrapper library written in C. For your example you could do something like
void wr_example_functions(ex *p) { *p = example_functions(*p); }
and in you Haskell code you write something like
foreign import ccall unsafe "wrapper.h" wr_example_functions :: Ptr Ex -> IO ()
exampleFunctions :: Ex -> IO Ex exampleFunctions input = with input $ \ptr -> do wr_example_functions ptr peek ptr
The structure is allocated on the stack, so the drawbacks are only another function call and two structure copies, and probably that shouldn't hurt a lot. Note that depending on the C compiler those costs may even get somewhat optimized (e.g. by inlining). [1] http://hackage.haskell.org/package/Hipmunk -- Felipe.