建议在ARM上的iOS应用程序中将Haskell作为脚本引擎嵌入?

几个月前我试图将 Haskell编译成iOS应用程序.
不幸的是,我能找到的唯一稳定/维护的实现是GHC,所以我尝试了某种交叉编译,但由于没有用于ARM / iOS的RTS而失败了.

我意识到这对我来说不够容易.所以我要求为此提出一些建议.我知道iOS有一个补丁,但它不再继续了.我考虑过NHC / YHC,但我不能使用丢弃的实现.如果我错了,请纠正我.

解决方法

使用 GHC-iPhoneForeign 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

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...