Ответ 1
Если размер списка аргументов неизвестен "до времени исполнения", вам в любом случае нужно будет преобразовать функцию во что-то, что работает в списке. Обратите внимание, что тип (IORef [Word32]) означает, что при выполнении программы IO-действие будет читать/записывать (изменяемый) список Word32. Программы Haskell должны только сказать, как мутировать/читать/записывать список - следовательно, монада IO().
В файле LLVM git, на который вы ссылаетесь, есть примеры /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
который увеличивает указатель на список ints, p и уменьшает оставшуюся длину я в каждом вызове блока 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", который сдвигает список один раз влево. В этом репо также упоминается список рассылки: [email protected]
GHC7 может компилироваться с использованием LLVM, но я думаю, это не помогло бы в программе Haskell, интерпретирующей язык, если GHC также не компилирует JIT - кто-нибудь знает, если это так?