FFI bağlama ve DSL
Haskell LLVM bindings, değişkenler (aslında derleme sırasında bilinen sabit bir sayı yani) değişken bir dizi ile bir işlev tanımlamak için çalışıyorum. this question ve cevabı takip etmeye çalışıyorum buldum.
İstemiyorum geri tamamen kullanarak FFI için üreten LLVM, kullanmak istiyorum DSL elimden geldiğince ve kullanım FFI tek yaptığım şeyleri yapamıyorum üzerinden DSL.
FunctionType üzerinden bir türü tanımlamak için başardı, hala bir modül defineModule
Arama tarafından oluşturulan bir işlev eklemek için kuramıyorum. Yine bence bundan sonraki adım olarak Ekle temel taşları fonksiyonu üzerinden FFI.appendBasicBlock
hangi bence kolay, ama nasıl alabilirim argümanları üzerinden FFI.getParam
içinde bir blok içinde CodeGenFunction
monad.
CEVAP
Bağımsız değişken listesinin büyüklüğü bilinmez 'zamanı gelene kadar, bir işlevi dönüştürmek için bir liste üzerinde zaten çalışma gerekir. (İORef [Word32]) türü IO bir eylem okuyup okumayacağı programın çalışması sırasında (değişken) Word32 listesi/yazma unutmayın. Haskell programları sadece söylemek zorundayımnasılokuma//liste yazmak mutasyona dolayısıyla IO() monad.
Örnek bir Liste var.LLVM gıt hs dosyasını başvurulan proje. LLVM bir derleme yordamı oluşturur"", . 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
bu artışlarla değer vermez, p, ve azaltır listesi için bir işaretçi kalan uzunluğu, her duada 'vücut' blok. Bu bloğu tekrar tekrar çağırır '' ve depolar sonucu 'vars', sonunda geri döndü (sıfır el değmemiş) için 's mList işlev içinde:'. loopBody
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üm ekstra şeyler hakkında nelem/NextListElement 'loopBody, sonra listeyi kaydırır sol. için için kendi örneği içinde kullanılır Bu repo da bir e-posta listesi bahseder: haskell-llvm@projects.haskellorg.
GHC7 LLVM kullanarak derlemek olabilir, ama bu Haskell bir program DZD sürece bir dil çeviri derleme de TAM zamanında geliyor - herkes bu durumda yardımcı olmaz sanırım?
bağlama komut satırından MySQL...
Android etkinliği için bağlama hizmeti...
Veri bağlama Nasıl çalışır?AngularJS :...
Bağlama böyle büyük mükafat 4 iOS proj...
JQuery bağlama ve canlı yöntemleri ara...