I have a query which is asked out of interest's sake...
I'm essentially looking for an affirmation of what I think I already
understand (or some info if I'm deluded ;)).
To put this in context...
I have some C code...
typedef int func(void *);
void from_maybe_int(void *val, func *my_func)
{
int i;
i = my_func(val);
printf("value within C: %d\n", i);
}
And some Haskell code...
type FromMaybeInt = StablePtr (Maybe Int) -> IO CInt
foreign import ccall "wrapper"
wrapFromMaybeInt :: FromMaybeInt
-> IO (FunPtr FromMaybeInt)
foreign import ccall "from_maybe_int"
cFromMaybeInt :: StablePtr (Maybe Int)
-> FunPtr GetJust
-> IO ()
functionToPass :: FromMaybeInt
functionToPass sPtr = do
m <- deRefStablePtr sPtr
case m of
Nothing -> return (-1)
Just i -> return (fromIntegral i)
main :: IO ()
main = do sPtr <- newStablePtr (Just 3) -- for example
funPtr <- wrapFromMaybeInt functionToPass
cFromMaybeInt sPtr funPtr
freeStablePtr sPtr
The compiled program works fine. However I wanted to check this was
correct usage. As in, is perfectly fine to pass a value of type
StablePtr a into C?
Am I correct in thinking that StablePtr is defined as a void pointer in
C? From my very limited understanding of C, it is also the case that you
can implicitly cast a void pointer to any other pointer type and
vice-versa. Some appear to deem it bad practice if you explictly give
the cast.
So therefore I am somewhat hazy on the use for castStablePtrToPtr. I
found the ghc docs to be quite cryptic for this function.
Google dug up a few examples of it's use in PUGS... which has lead me to
think that the function is purely for type 'convience' in Haskell. Is
this the case or am I missing a use case here?
Disclaimer: My knowledge and experience of C is somewhat limited.
Ironically I have started playing with C by way of Haskell. (Sick and
twisted I know).
Thanks, Daniel James
P.S. I must say, I really like the Haskell FFI. Very clean and
enjoyable to work with.