I am happy to announce libffi 0.1, binding to the C library libffi, allowing C functions to be called whose types are not known before run-time.
Why? Sometimes you can't use the haskell foreign function interface because you parse the type of the function from somewhere else, i.e. you're writing an interpreter for a language that has an FFI itself. What? The main function it exports is: callFFI :: FunPtr a -> RetType b -> [Arg] -> IO b And because code is worth a thousand words, here a small program that uses C to write a 1Gb buffer of random garbage to a file: > import System.Posix.DynamicLinker > import Foreign.LibFFI > > main = do > malloc <- dlsym Default "malloc" > creat <- dlsym Default "creat" > write <- dlsym Default "write" > let sz = 2 ^ 30 > buf <- callFFI malloc (retPtr retVoid) [argCSize sz] > fd <- callFFI creat retCInt [argString "/tmp/test", argCUInt > 0o644] > n <- callFFI write retCSize [argCInt fd, argPtr buf, argCSize > sz] > putStrLn $ show n ++ " bytes written" It should work on any 32/64bits machine on which libffi works, but has been primarily tested on linux x86_64. The current libffi is not exception-safe (exception = memory leak) and callFFI has quite some overhead that would be unnecessary with another api. It is, however, very easy to use :) More interesting examples are included in examples/ in the package. Where? Hackage: http://hackage.haskell.org/cgi-bin/hackage-scripts/package/libffi Module docs: http://www.science.uva.nl/~rturk/doc/libffi-0.1 Cheers, Remi _______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell