|Version 5 (modified by chak, 5 years ago) (diff)|
FFI Support for C Block Objects
Apple recently proposed the inclusion of lambda abstractions (closures) into C/C++/Objective-C and facilitated an implementation in the clang compiler framework. They called this language extension blocks (or block objects). It is widely used in the APIs of OS X 10.6 (Snow Leopard) and 10.7 (Lion). This page is about extending the Haskell 2010 FFI to directly support blocks — i.e., to enable Haskell functions to be marshalled as blocks to C and to enable C blocks to be marshalled as Haskell functions to Haskell land. This extension will be enabled by the language option BlockObjects.
Example: calling a higher-order C function
As an example, consider the library function qsort_b:
void qsort_b(void *base, size_t nel, size_t width, int (^compar)(const void *, const void *));
In C, we might use this function as described in Apple's introduction to block: Using a Block Directly. We would like to be able to do the same in Haskell by writing:
foreign import ccall qsort_b "stdlib.h" :: Ptr a -> CSize -> CSize -> (Ptr a -> Ptr a -> Int) -> IO ()