2013-07-23 12 views
15

Sto creando un'applicazione in Qt (C++) che utilizza la libreria scritta in Haskell come back-end. Come posso esportare l'interfaccia della libreria Haskell su C++?Chiamata alla libreria Haskell da C++

Quando le funzioni nella libreria haskell utilizzano tipi semplici come int o float, non è un problema, ma quando usano le strutture come argomenti? Qual è la soluzione più scalabile in questo caso?

+1

Che dire di fare IPC con un [dominio UNIX socket] (https://en.wikipedia.org/wiki/Unix_domain_socket)? –

+1

IPC ha bisogno di effettuare il marshalling su entrambi i lati. Questo è un qualche tipo di soluzione, ma richiede ancora molto lavoro e non è efficiente come potrebbe essere. – remdezx

+1

Non l'ho provato, ma potrebbe essere utile per voi: https://github.com/wavewave/fficxx – Yuras

risposta

3

Avrai bisogno di scrivere il codice haskell per mettere in ordine quelle strutture dati in quelle che puoi usare in Haskell. Lo strumento c2hs è molto utile a questo proposito: http://hackage.haskell.org/package/c2hs

Mentre lo strumento appare essere progettato per chiamare C da Haskell, è anche molto utile per il contrario in un certo senso - permette di marshall complesso C tipi in tipi Haskell. Dal momento che le funzioni che esponi dovranno prendere i tipi C (tipicamente puntatori a strutture complesse), allora puoi A) costruire strutture C appropriate, e B) usare le funzioni fornite da c2hs per poi organizzare queste strutture in Haskell nelle tue funzioni esposte , così puoi lavorare con loro.

Si noti inoltre che con gli strumenti in stile c2hs non è necessario eseguire il marshalling di tutto. Puoi solo generare degli accessor per dare un'occhiata alle parti delle strutture di dati C che ti interessano veramente.

+2

Hum, in realtà, vuole generare intestazioni/wrap C per chiamare le funzioni haskell dal codice C++. Non scrivere haskell binding del codice C++. Penso che tu abbia letto il contrario. –

+0

È vero, ho bisogno di chiamare il codice haskell da C++. – remdezx

+0

remdezx: vedere la mia modifica – sclv

2

in ritardo alla festa, ma penso che si desidera utilizzare questo:

particolare qualcosa come foreign export ccall foo :: Int -> IO Int. Che genererà un colpo di testa come ad esempio:

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

Vedi il link per maggiori dettagli (ad esempio come integrare nel vostro programma C++).

+1

Questa risposta non aggiunge nulla a ciò che l'OP ha detto di sapere come fare, in particolare non spiega come gestire strutture complesse. – bmaderbacher

Problemi correlati