News for hackers. Stuff that matters.
Re:GHC 7.8.1 released by lucian1900 on Wednesday April 09, 2014 @12:47PM (#7560486)
Part of the problem is that iOS APIs tend to be Objective-C, which is somewhat harder to wrap in Haskell.
Re:GHC 7.8.1 released by gregschlom on Wednesday April 09, 2014 @01:18PM (#7560709)
Not really, it's quite easy to call Objective-C methods (or more correctly, to send messages to Objective-C selectors) and perform other Objective-C-related tasks from C. See: https://developer.apple.com/library/mac/documentation/Cocoa/...

This is actually what the Objective-C compiler does. It translates your Objective-C code to C method calls.

Re:GHC 7.8.1 released by chc on Wednesday April 09, 2014 @01:51PM (#7560938)
It's not that easy. I mean, just sending a message could entail one of objc_msgSend, obj_msgSend_stret or objc_msgSend_fpret, and which one you want to use is not always as clear-cut as you might prefer (http://www.sealiesoftware.com/blog/archive/2008/10/30/objc_e...). And then there's the hassle of defining classes dynamically, which entails six function calls just to create a class with one empty method, and one of those essential functions is not actually provided for you AFAIK unless you're using Apple's compiler where it's a builtin, so you'll need to write it yourself.

It's not ridiculously hard, but it's somewhat less easy than normal C FFI.

Re:GHC 7.8.1 released by iand675 on Wednesday April 09, 2014 @04:38PM (#7562195)
The other hard part about it is that Haskell's FFI doesn't support variadic functions in a friendly way, which makes argument passing that much trickier.
Re:GHC 7.8.1 released by JoshTriplett on Wednesday April 09, 2014 @07:22PM (#7563204)
If you just need to call variadic functions with a specific parameter list determined at compile time, that's easy with the existing FFI; just write a prototype for the function for any given set of arguments you want to call it with. (For instance, you can have an FFI binding printf_int_float :: CString -> CInt -> CFloat -> IO CInt .)

If you really need to construct calls at runtime and you don't know the argument list at compile time, there's a Haskell binding to libffi. However, you generally only need that if you're writing a language interpreter or similar.

Re:GHC 7.8.1 released by chc on Wednesday April 09, 2014 @05:32PM (#7562595)
There is a similar problem with objc_msgSend in C: Methods with certain argument types can't be called with a normal objc_msgSend(). Instead, you need to create a specifically typed function pointer and assign objc_msgSend to it. I think a similar solution would be necessary with Haskell.
Re:GHC 7.8.1 released by iand675 on Wednesday April 09, 2014 @07:10PM (#7563149)
I'd appreciate seeing a link to an example of this. I put a decent amount of work (a few years ago) into writing some bindings in Haskell to the objc runtime, but ended up shelving it until I could come up with a satisfactory solution to the variadic function dilemma.
Re:GHC 7.8.1 released by chc on Wednesday April 09, 2014 @07:51PM (#7563331)
Here are a couple of Stack Overflow answers that illustrate how you do it in Objective-C:

http://stackoverflow.com/a/2573949

http://stackoverflow.com/a/18689338

If you're interested in the nitty-gritty of how objc_msgSend works, bbum from Apple wrote up a great low-level walkthrough a few years back: http://www.friday.com/bbum/2009/12/18/objc_msgsend-part-1-th...