2013-07-23 13 views
15

Buduję aplikację w Qt (C++), która używa biblioteki napisanej w Haskell jako zapleczu. Jak mogę wyeksportować interfejs biblioteki Haskell do C++?Wywołanie biblioteki Haskell z C++

Gdy funkcje w bibliotece haskell używają prostych typów, takich jak int lub float, to nie problem, ale co, gdy używają struktur jako argumentów? Jakie jest najbardziej skalowalne rozwiązanie w tym przypadku?

+1

Co zrobić z IPC z [gniazdem domeny UNIX] (https://en.wikipedia.org/wiki/Unix_domain_socket)? –

+1

IPC wymaga zestawiania po obu stronach. Jest to pewnego rodzaju rozwiązanie, ale wciąż wymaga wiele pracy i nie jest wydajne, jak mogłoby być. – remdezx

+1

Nie próbowałem go, ale może być przydatny dla ciebie: https://github.com/wavewave/fficxx – Yuras

Odpowiedz

3

Będziesz musiał napisać kod z haskela, który przekaże te dane do tych, których możesz użyć w Haskell. Narzędzie C 2H jest bardzo pomocne w tym względzie: http://hackage.haskell.org/package/c2hs

Chociaż narzędzie pojawia być zaprojektowane do wywoływania C Haskell, jest również bardzo przydatny dla przeciwnej w pewnym sensie - to pozwala na Marszałkowskiego złożonego C typy do typów Haskella. Ponieważ funkcje, które wyeksponujesz będą musiały przyjmować typy C (zazwyczaj wskaźniki do złożonych struktur), wtedy możesz A) konstruować odpowiednie struktury C, a B) korzystać z funkcji c2hs zapewnia, aby następnie przenieść te struktury do Haskella w swoich eksponowanych funkcjach , abyś mógł z nimi pracować.

Należy również pamiętać, że przy użyciu narzędzi generowanych w stylu c2hs nie ma potrzeby porządkowania wszystkiego. Możesz po prostu wygenerować dostęp do podglądu części struktur danych C, na których ci zależy.

+2

Hum, właściwie, chce generować nagłówki/zawijanie C, aby wywoływać funkcje haskell z kodu C++. Nie pisać wiązania ISKELL kodu C++. Myślę, że przeczytałeś rozmowę. –

+0

To prawda, muszę wywołać kod haskell z C++. – remdezx

+0

remdezx: zobacz moją edycję – sclv

2

późno do partii, ale myślę, że chcesz to wykorzystać:

Konkretnie coś podobnego foreign export ccall foo :: Int -> IO Int. Który wygeneruje nagłówek taki jak:

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

Zobacz link, aby uzyskać więcej informacji (np. Jak zintegrować program C++).

+1

Ta odpowiedź nie dodaje nic do tego, co OP powiedział, że wie, jak to zrobić, szczególnie, że nie wyjaśnia, jak obsługiwać złożone struktury. – bmaderbacher