2016-03-21 12 views
2

Bevor jemand darauf hinweist, habe ich die Antwort hier angesehen: Best way to call Haskell functions from within Java und ich bin total verloren Lesen dieser Antworten.So rufen Sie Haskell von Java

Ich habe eine Reihe von Haskell-Funktionen in einer Datei namens "output.hs". Normalerweise würde ich zur Ausführung dieser Funktionen einen Interpreter wie Hugs verwenden und meine Befehle von ihrer Eingabeaufforderung aus eingeben.

Was ich tun möchte, emulieren diesen Prozess von einer Java-Anwendung. Ich habe ein Java-Swing-Textfeld, in dem der Benutzer einen Befehl in Haskell eingeben würde, und was ich tun möchte, ist, diesen Befehl interpretieren zu lassen und die Ausgabe in einem nahegelegenen Textbereich anzuzeigen. Im Grunde mache ich eine Front für einen Haskell-Dolmetscher.

Hat jemand direkte Erfahrung damit?

+5

Sollte dies nicht aufgerufen werden, wie Haskell von Java aufrufen? –

+0

Ja, ich glaube ich habe den Titel versehentlich gewechselt. – dinstruction

+1

@MaxLipton die Tatsache, dass Sie verloren sind, diese Antworten zu lesen, bedeutet nicht, dass sie die Frage nicht beantworten. Es bedeutet nur, dass Sie mehr lernen müssen, um sie zu verstehen. – sclv

Antwort

3

Wie wäre es mit nur einem GHCi/Hugs-Prozess, senden Sie ihm die Eingabe und umleiten Stdout und Stderr zu Ihrer Anwendung? Die Java-API hat bereits, was Sie benötigen, z. java.lang.ProcessBuilder.

Durch das einfache Aussetzen der Funktionen erhalten Sie nicht die Möglichkeit, Haskell zu interpretieren, indem Sie nur diese Funktionen (entweder durch Bibliotheksaufruf oder Dienst) offen legen, sondern nur die Funktionen und nicht die Fähigkeit, Haskell-Eingaben auszuwerten.

Um die Haskell-Eingabe zu bewerten, würden Sie entweder Ihren eigenen Interpreter schreiben, einen vorhandenen Interpreter verwenden (ich glaube nicht, dass es einen gibt), oder die vorgeschlagene Option wählen, die am praktischsten und einfachsten sein sollte: einen vorhandenen Interpreter verwenden und Rufen Sie es als einen Prozess auf.

Ich habe einige Erfahrung mit diesem Ansatz, es ist sehr einfach, zur Arbeit zu kommen, aber achten Sie auf unerwartete Beendigung und natürlich entscheiden, was Sie tun möchten, wenn das passiert. Wenn dies für Ihre Domäne zu schwierig ist, können Sie auch den Interpreter pro Ausdruck aufrufen (z. B. ghc -e "1 + 1" wird 2 ausgeben. Weitere Informationen finden Sie unter Modes of operation im GHC-Handbuch, Abschnitt 4.5.2). Dies könnte einfacher sein, aber ich würde es nur für seltenere Auswertungen verwenden, weil es langsamer ist und sich bei schneller Eingabe bemerkbar macht.