Haskell-Interpreter in C ++ schreiben (mit ghc oder Umarmen als Bibliothek)

8

Ich schreibe eine C ++ - Anwendung, die Haskell-Code interpretieren und auswerten muss. Dieser Code ist zur Kompilierzeit nicht bekannt, wird aber vom Benutzer angegeben. Gibt es eine Möglichkeit, einen Haskell-Compiler / Interpreter (wie GHCi oder Hugs) als Bibliothek zu verwenden?

  • Ich habe FFI gefunden, aber das scheint nur für Haskell-Code zu funktionieren, der zur Kompilierzeit bekannt ist.
  • Ich habe die GHC-API und den Hinweis gefunden, aber sie scheinen nur zu funktionieren, wenn ich Haskell-Code aus Haskell interpretieren will.
Heinzi 27.12.2011, 15:22
quelle

2 Antworten

7

Anstatt den GHC api zu verwenden, würde ich vorschlagen, an Hinweis für diesen speziellen Ansatz zu binden, der nur ein vereinfachter Wrapper ist rund um die GHC api. Der Grund, warum ich dies empfehlen würde, ist, dass die GHC api ein bisschen eine steile Lernkurve hat.

Wie auch immer, wie ich schon sagte In meinem Kommentar würde es, abhängig davon, wie tief Sie das wollen, nur wenige FFI-Anrufe erfordern. Im Folgenden gebe ich ein Beispiel, wie man Ausdrücke aus einer geladenen Datei ausführt und die Ergebnisse zurückgibt (nur wenn es eine Show-Instanz gibt). Dies sind nur die Grundlagen und geben die Ergebnisse als eine Struktur sollte auch möglich sein.

%Vor%

Da wir Haskell-Land verlassen müssen, müssen wir eine Möglichkeit haben, auf den Kontext Bezug zu nehmen. Wir können dies mit einem StablePtr tun und ich wickle es einfach in ein IORef , um es veränderbar zu machen, falls Sie es wollen Dinge in der Zukunft ändern. Beachten Sie, dass die GHC-API die Typüberprüfung eines In-Memory-Puffers nicht unterstützt. Daher müssen Sie den zu interpretierenden Code vor dem Laden in eine temporäre Datei speichern.

Die -- @@ Annotations sind für mein Werkzeug Hs2lib, behalte nichts dagegen, wenn du es nicht benutzt.

Meine Testdatei ist

%Vor%

und wir können dies mit einem einfachen Test testen

%Vor%

Also ja, es funktioniert in Haskell, jetzt um es außerhalb von Haskell arbeiten zu lassen.

Fügen Sie einfach zum Anfang der Datei einige Anweisungen für Hs2lib hinzu, um ModuleName zu marshalieren, da dieser Typ in einer Datei definiert ist, zu der er keine Quelle hat.

%Vor%

oder

%Vor%

wenn auf einer 64bit Architektur,

und rufen Sie Hs2lib

auf %Vor%

Und Sie werden unter anderem mit einer Include-Datei mit

enden %Vor%

Ich habe die C ++ Seite nicht getestet, aber es gibt keinen Grund, warum es nicht funktionieren sollte. Dies ist ein sehr einfaches Beispiel, wenn Sie es zu einer dynamischen Lib kompilieren, möchten Sie wahrscheinlich stdout, stderr und stdin umleiten.

    
Phyx 28.12.2011, 03:42
quelle
4

Da GHC in Haskell geschrieben ist, ist seine API exklusiv von Haskell erhältlich. Die Schnittstellen, die Sie in Haskell benötigen, und die Bindung an C mit dem FFI, wie Daniel Wagner vorgeschlagen hat, werden die einfachste Route sein. Dies ist wahrscheinlich einfacher als eine direkte Bindung der GHC-API an C wäre; Sie können die Stärken von Haskell nutzen, um die benötigten Schnittstellen zu erstellen und nur mit ihnen in C ++ auf der obersten Ebene zu interagieren.

Beachten Sie, dass Haskells FFI nur nach C exportiert; Wenn Sie einen C ++ - ish-Wrapper drumherum haben wollen, müssen Sie es als eine andere Ebene schreiben.

(BTW, Hugs ist alt und nicht gepflegt.)

    
ehird 27.12.2011 16:58
quelle

Tags und Links