几个月前我试图将
Haskell编译成iOS应用程序.
不幸的是,我能找到的唯一稳定/维护的实现是GHC,所以我尝试了某种交叉编译,但由于没有用于ARM / iOS的RTS而失败了.
不幸的是,我能找到的唯一稳定/维护的实现是GHC,所以我尝试了某种交叉编译,但由于没有用于ARM / iOS的RTS而失败了.
我意识到这对我来说不够容易.所以我要求为此提出一些建议.我知道iOS有一个补丁,但它不再继续了.我考虑过NHC / YHC,但我不能使用丢弃的实现.如果我错了,请纠正我.
解决方法
使用
GHC-iPhone和
Foreign Function Interface相当容易
作为参考,David Pollak有一个实现在Haskell中编写的Lisp解释器的示例,在iPad应用程序中运行:
07002
在main.m中声明Haskell main的示例:
extern int Haskell_main(int argc,char* argv[]); int main(int argc,char* argv[]) { Haskell_main(argc,argv); }
在他的Main.hs中,一系列外部函数声明授予他访问Cocoa库的权限:
foreign import ccall safe "openWindow" openWindow :: IO CInt data ViewController_struct type ViewController = Ptr ViewController_struct type RunStr = ViewController -> CString -> IO () foreign import ccall safe "wrapper" wrapFuncInvoke :: RunStr -> IO (FunPtr RunStr) foreign import ccall safe "setLispEval" setLispEval :: ViewController -> FunPtr RunStr -> IO () foreign import ccall safe "addToResult" addToResult :: ViewController -> CString -> IO () data ObjCId_struct type ObjCId = Ptr ObjCId_struct data ObjCSEL_struct type ObjCSEL = Ptr ObjCSEL_struct foreign import ccall safe "objc_msgSend" objc_msgSend :: ObjCId -> ObjCSEL -> IO ObjCId foreign import ccall safe "objc_msgSend" objc_msgSendInt :: ObjCId -> ObjCSEL -> Int -> IO ObjCId foreign import ccall safe "sel_registerName" sel_registerName :: CString -> IO ObjCSEL foreign import ccall safe "objc_lookUpClass" objc_lookUpClass :: CString -> IO ObjCId