2014-04-23 22 views
7

Ich möchte eine Haskell-Funktion von C/C++ aufrufen. Ich habe bereits ein paar Tutorials zu diesem Thema gelesen, aber IO-Monad-Anrufe sind darin nicht enthalten. Insbesondere möchte ich eine Funktion aufrufen, die die interact Funktion (interact :: (String -> String) -> IO()) verwendet.C/C++ Wrapper für Haskell IO Monad

  • Ich verstehe nicht, wie man Funktionen in diesem Fall verwendet?
  • Wie kann ich Funktion in C/C++ - Wrapper deklarieren?
  • Wie wird die Steuerung der Standardeingabe/-ausgabe zwischen C/C++ und Haskell (im C/C++ - Code) übertragen?
+0

Möchten Sie Haskell von C oder C von Haskell anrufen? – acomar

+0

@acomar Ich glaube der OP möchte Haskell von C. anrufen. – duplode

+0

@ duplode Genau, würde ich gerne Haskell von C/C++ anrufen – Simplex

Antwort

2

Ich werde diese Antwort relativ kurz halten, da das meiste davon in der FFI documentation abgedeckt ist.

Sie können die Funktionen verwenden, indem Sie sie in C namentlich aufrufen. Die Funktionen müssen als foreign export deklariert werden und entsprechen der foreign import Syntax zum Aufrufen von Funktionen, die in einem C-Modul in Haskell definiert sind. In C müssen Sie die Funktion als extern deklarieren und geben Sie eine normale Signatur.

Ihre interact Funktion kann nicht direkt deklariert werden, weil es Typen verweist, die nicht in C definiert sind, können Sie eine entsprechende Funktion definieren und schreiben, die interact in Haskell ruft:

interact_hs :: FunPtr (CString -> CString) -> IO() 

Diese Funktion würde dann muss sein Argument (mit Umbruch) verwenden, um interact aufzurufen.

In C diese Funktion erscheint dann als:

extern void interact_hs(char*(*f)(char*)); 

oder so ähnlich, meine Funktionszeiger Syntax rostig ist.

Um diese Funktion tatsächlich von C aufzurufen, müssen Sie die Haskell-Laufzeit (in der Dokumentation behandelt) initialisieren und dann die Funktion aufrufen, wobei die Ausführungssteuerung in Haskell übergeht. Sobald die Funktion beendet und kehrt die Steuerung der Ausführung fährt zurück in C.

Weitere nützliche Ressourcen für die mit dem FFI arbeiten:

Fühlen Sie sich frei, andere nützliche Links vorschlagen!

+0

Vielen Dank! Ich löse dieses Problem! – Simplex