Am Samstag, 22. Oktober 2005 01:42 schrieb John Meacham: > On Fri, Oct 21, 2005 at 03:19:36PM +0100, Joel Reymont wrote: > > Is there a particular reason why StablePtr cannot provide a "fixed" > > memory address? Then 4 bytes of memory won't need to be allocated so > > that C could write to them and C could just modify the Haskell variable. > > because haskell values don't have the same representation as C values. > haskell values are pointers to updatable thunks. in any case 'with' > just allocates 4 bytes on the stack (the same as a auto C declaration) > so is quite speedy compared to what it would take to make a haskell > value look like a C one. not to mention haskell values can't be > modified.
2 tiny remarks: * In Simon's example the first parameter to 'with' (the initial buffer size) was missing, but I guess you've figured this out already. In general: If the pointer you're passing to C has "in" semantics, 'with' (or one of its variations) is your friend. For "in/out" semantics, use 'with' + 'peek', and for "out" semantics" use 'alloca' + 'peek'. * As already mentioned, StablePtr can even refer to something which has no direct C counterpart, like Haskell functions. Needing them in the C world seems strange at first, because there is nothing thrilling you can do with them but pass them back to Haskell. But there are actually some good uses for that, like interfacing to callback-based C APIs where some additional bookkeeping is needed. Cheers, S. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe