Nếu kích thước của danh sách đối số không được biết đến 'cho đến khi chạy, bạn sẽ cần phải chuyển đổi hàm thành một cái gì đó hoạt động trên danh sách. Lưu ý rằng kiểu (IORef [Word32]) có nghĩa là một hành động IO sẽ đọc/ghi một danh sách Word32 (có thể thay đổi) trong khi thực hiện chương trình. Các chương trình Haskell chỉ phải nói cách biến đổi/đọc/ghi danh sách - do đó đơn vị IO().
Có một ví dụ/tệp List.hs trong dự án LLVM git mà bạn đã tham chiếu. Nó xây dựng một thói quen lắp ráp 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
mà increments một con trỏ đến một danh sách các ints, p, và decrements chiều dài còn lại, i, trong mỗi lời gọi của khối 'body'. khối đó nhiều lần gọi 'loopBody' và lưu trữ kết quả trong 'vars', mà là cuối cùng trả lại (ảnh hưởng tại zero) để 's' bên trong hàm 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)
Tất cả các công cụ bổ sung về nelem/NextListElement là được sử dụng bên trong ví dụ của họ cho 'loopBody,' mà thay đổi danh sách một lần sang trái. Repo đó cũng đề cập đến một danh sách gửi thư: [email protected]
GHC7 có thể biên dịch bằng LLVM, nhưng tôi đoán điều này sẽ không giúp ích trong chương trình Haskell diễn giải ngôn ngữ trừ khi GHC cũng biên dịch JIT - bất kỳ ai biết đây có phải là trường hợp không?
Nguồn
2012-12-21 06:55:25