Рекомендация по внедрению Haskell в качестве движка скриптов в приложения для iOS на ARM? - PullRequest
8 голосов
/ 12 июня 2011

Я пытался собрать Haskell в приложение для iOS несколько месяцев назад. К сожалению, единственной стабильной / поддерживаемой реализацией, которую я смог найти, была GHC, поэтому я попробовал какую-то кросс-компиляцию, но не удалось из-за отсутствия RTS для ARM / iOS.

Я понял, что это не так просто для меня. Поэтому я запрашиваю некоторые рекомендации для этого. Я знаю, что есть патч для iOS, но он больше не продолжается. Я рассматривал NHC / YHC, но я не мог использовать отброшенную реализацию. Если я ошибаюсь, поправьте меня.

1 Ответ

8 голосов
/ 22 июня 2011

Это довольно просто, используя GHC-iPhone и Интерфейс внешних функций

Для справки, у Дэвида Поллака есть пример реализации интерпретатора Lisp, написанный на Haskell, который запускается внутри приложения для iPad:

https://github.com/dpp/LispHaskellIPad

Пример объявления основной сети Haskell в main.m:

extern int Haskell_main(int argc, char* argv[]);

int main(int argc, char* argv[])
{
    Haskell_main(argc, argv);
}

и в его Main.hs серии объявлений о внешних функциях, предоставляющих ему доступ к библиотекам Какао:

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
...