2013-07-23 12 views
15

Haskell'de arka uç olarak yazılan kütüphaneyi kullanan Qt (C++) numaralı bir uygulama yapıyorum. Haskell kitaplığının arayüzünü C++'a nasıl dışa aktarabilirim?C++ 'dan Haskell kütüphanesi çağrılıyor

Haskell kitaplığındaki işlevler, int veya float gibi basit türleri kullanırken, sorun değil, yapıları bir argüman olarak kullanırken ne olur? Bu durumda en ölçeklenebilir çözüm nedir?

+1

IPC'yi [UNIX etki alanı soketi] ile yapmaya ne dersiniz? (Https://en.wikipedia.org/wiki/Unix_domain_socket)? –

+1

IPC'nin her iki tarafta da sıralamaya ihtiyacı var. Bu, bir tür çözüm, ama yine de çok iş gerektiriyor ve olabildiğince verimli değil. – remdezx

+1

Denemedim, ama sizin için yararlı olabilir: https://github.com/wavewave/fficxx – Yuras

cevap

3

Bu veri yapılarını Haskell'de kullanabileceğinizlere kodlamak için haskell kodunu yazmanız gerekir. Eğer izin veren Marshall kompleksi C - http://hackage.haskell.org/package/c2hs

Haskell dan C çağırmak için tasarlanmış olması görünen aracı, aynı zamanda bir anlamda ters için çok kullanışlı olsa da: c2hs aracı bu konuda çok yararlıdır Haskell tipleri Açıkladığınız fonksiyonlar C tiplerini (tipik olarak karmaşık yapılara işaretçiler) alması gerektiğinden, A) uygun C yapıları oluşturabilir ve B) daha sonra, bu yapıları Haskell'e maruz kalan fonksiyonlarınızda sıralamak için sağlanan c2hs özelliklerini kullanır. Böylece onlarla çalışabilirsiniz.

Ayrıca, c2hs stili oluşturulmuş araçlarla, her şeyi mareşleştirmenize gerek olmadığını unutmayın. Aslında gerçekten önemsediğiniz C veri yapılarının bölümlerine göz atmak için erişim sağlayıcıları oluşturabilirsiniz.

+2

Hum, aslında C++ kodundan haskell işlevlerini çağırmak için C üstbilgileri/sargıları oluşturmak istiyor. C++ kodunun haskell bağını yazmamak. Bence sohbeti okudun. –

+0

Bu doğru, C++ 'dan haskell kodunu çağırmam gerekiyor. – remdezx

+0

remdezx: benim düzenleme – sclv

2
partiye Geç

, ama bunu kullanmak istiyorum düşünüyorum: foreign export ccall foo :: Int -> IO Int gibi

Özellikle bir şey. Hangi gibi bir başlık oluşturur:

#include "HsFFI.h" 
extern HsInt foo(HsInt a0); 

(örneğin C++ programı içine nasıl entegre gibi) daha fazla bilgi için linke bakınız.

+1

Bu cevap, OP'nin nasıl yapılacağını bildiğini söylediği şeylere hiçbir şey eklemiyor, özellikle karmaşık yapıların nasıl ele alınacağını açıklamıyor. – bmaderbacher