[Haskell-cafe] FFI export questions
Sebastian Sylvan
sebastian.sylvan at gmail.com
Thu Mar 17 15:38:03 EST 2005
I'm not sure I understand you, but I think what you're asking is
"how do I create a C wrapper of a Haskell function, so that I can pass
it to an imported C function"?
If that indeed is what you're asking, then allow me to post a
real-world example of how to do this:
-- create wrapper
type StreamCallback = Ptr CSoundStream -> Ptr () -> CInt -> Ptr () -> IO CSChar
foreign import ccall "wrapper" mkStreamCallbackRaw :: StreamCallback
-> IO (FunPtr StreamCallback)
-- the function which uses the wrapper
foreign import ccall "fmod.h FSOUND_Stream_SetEndCallback"
fsound_StreamEndCallbackRaw :: Ptr CSoundStream -> FunPtr
StreamCallback -> Ptr () -> IO CSChar
Then you can just call:
do callback <- mkStreamCallbackRaw myHaskellCallbackFunction
c <- fsound_StreamEndCallbackRaw soundStream callback nullPtr
/S
On Thu, 17 Mar 2005 14:11:31 -0600, John Goerzen <jgoerzen at complete.org> wrote:
> Hi,
>
> I'm trying to make a Haskell binding for the FUSE library,
> http://fuse.sourceforge.net/. The FUSE concept is centered around a
> struct whose members are pointers to callback functions.
>
> Here's the problem: the functions I want to callback to have types like
> this:
>
> vGetLine :: HVFS a -> a -> IO String
>
> Now, I can't just pass some sort of opaque pointer to C, because then
> the exact type of a would be lost.
>
> Is there any other method I might try?
>
> Thanks,
>
> John
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
--
Sebastian Sylvan
+46(0)736-818655
UIN: 44640862
More information about the Haskell-Cafe
mailing list