Если размер списка аргументов неизвестен до времени выполнения, вам все равно придется преобразовать функцию во что-то, работающее со списком.Обратите внимание, что тип (IORef [Word32]) означает, что действие ввода-вывода будет читать / записывать (изменяемый) список Word32 во время выполнения программы.Программы на Haskell должны только сказать как , чтобы изменить / прочитать / записать список - отсюда и монада IO ().
В файле git проекта LLVM есть файл examples / List.hs, который выссылки.Он создает подпрограмму сборки LLVM "arrayLoop",
arrayLoop ::
(Phi a, IsType b,
Num i, IsConst i, IsInteger i, IsFirstClass i, CmpRet i Bool) =>
Value i -> Value (Ptr b) -> a ->
(Value (Ptr b) -> a -> CodeGenFunction r a) ->
CodeGenFunction r a
arrayLoop len ptr start loopBody = do
, которая увеличивает указатель на список целых чисел p и уменьшает оставшуюся длину i при каждом вызове блока body.Этот блок неоднократно вызывает 'loopBody' и сохраняет результат в 'vars', который в конечном итоге возвращается (нетронутым в нуле) в 's' внутри функции mList:
mList ::
CodeGenModule (Function
(StablePtr (IORef [Word32]) -> Word32 -> Ptr Word32 -> IO Int32))
mList =
createFunction ExternalLinkage $ \ ref size ptr -> do
next <- staticFunction nelem
let _ = next :: Function (StablePtr (IORef [Word32]) -> IO Word32)
s <- arrayLoop size ptr (valueOf 0) $ \ ptri y -> do
flip store ptri =<< call next ref
return y
ret (s :: Value Int32)
Все дополнительные вещи о nelem /NextListElement используется внутри их примера для loopBody, который смещает список один раз влево.В этом репозитории также упоминается список рассылки: haskell-llvm@projects.haskellorg.
GHC7 может компилироваться с использованием LLVM, но я полагаю, что это не поможет в программе на Haskell, интерпретирующей язык, если GHC также не выполняет JIT-компиляцию - кто-нибудьзнаете, так ли это?