Wie versende ich eine ausführbare Datei mit Language.Haskell.Interpreter?

136

Ich hatte gehofft, einen Haskell-Interpreter mit einbetten zu können, hintdamit ich Plugins in Haskell schreiben kann, die ich mit meinem Programm verwenden kann. Ich möchte nicht die gesamte Haskell-Plattform für meine ausführbaren Dateien ausliefern müssen.

Normalerweise sind ausführbare Dateien von Haskell ziemlich eigenständig. Das Löschen von PATHverursacht beispielsweise kein Problem:

$ PATH=. Hello
Hello world

Ein einfaches Testprogramm mit runInterpreterBomben, wenn ich Folgendes lösche PATH:

$ PATH=. TryHint
GhcException "panic! (the 'impossible' happened)\n  (GHC version 7.8.3 for x86_64-apple-darwin):\n\tDynamic linker not initialised\n\nPlease report this as a GHC bug:  http://www.haskell.org/ghc/reportabug\n"

Welche Bibliotheken oder ausführbaren Dateien müssen in der Umgebung verfügbar sein, damit sie funktionieren?

otool gibt nicht viel Anleitung:

otool -L TryHint
TryHint:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
    /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
    /usr/local/lib/libgmp.10.dylib (compatibility version 13.0.0, current version 13.0.0)

Der Testcode für TryHintmacht nicht viel:

import Control.Monad
import Language.Haskell.Interpreter

main = do
  f <- runInterpreter $ loadModules ["Test"] >> setTopLevelModules ["Test"] >> interpret "f" (as :: Int -> Int)
  case f of
    Left e -> print e
    Right r -> mapM_ (print . r) [1..10]

Es wird nur an feine Funktion Test.hsgebunden, die zur Laufzeit interpretiert werden soll. Test.hssieht aus wie das:

module Test where
f :: Int -> Int
f x = x + 1
Michael Fox
quelle
6
Ich kann dieses Problem nicht reproduzieren. Wenn ich laufe, läuft PATH= ./TryHintalles reibungslos: Es werden einige Zahlen gedruckt und dann beendet. Ich benutze auch GHC 7.8.3. Wie baust du TryHint?
Daniel Wagner
7
Ich glaube auch, dass es wahrscheinlich spezifisch für OSX ist. Vielleicht haben Sie ein Ticket an GHC die geöffnet werden soll Tracker wie in der Fehlermeldung erwähnt (immerhin das unmöglich war nur geschehen).
MasterMastic
5
Ich habe keine Ahnung, was mit diesem Fehler los ist, aber auf jeden Fall hängt GHC von vielen Ressourcen ab, mit denen Sie sich nicht verstecken PATH=., wie den Schnittstellendateien für Prelude und allem, was es transitiv importiert, den eigentlichen Bibliotheksdateien base und ghc-prim und integer-gmp sowie die GHC- settingsDatei. (Grundsätzlich alles installiert unter /usr/lib/ghcoder das entsprechende Verzeichnis für Ihre Installation.)
Reid Barton
2
@MichaelFox Das statische Verknüpfen der GHC-API funktioniert nicht mit dem neuen dynamischen Linker, der in GHC 7.8 eingeführt wurde. Ich denke: | (interaktive Codeausführung erfordert jetzt dynamische Bibliotheken)
Bennofs
2
@bennofs es sieht so aus, als wäre dein Kommentar fast eine Antwort, wenn du ihn leicht umformulierst!
sclv

Antworten:

2

Der Versand einer ausführbaren Datei mit Language.Haskell.Interpreterscheint perfekt zu der von Ihnen gezeigten Art zu passen. Sie müssen PATHdas Skript festlegen , das Sie ausführen möchten.

Wie von @bennofs in den Kommentaren erwähnt, funktioniert die statische Verknüpfung der GHC-API nicht mit dem in GHC 7.8 eingeführten neuen dynamischen Linker (für die interaktive Codeausführung sind jetzt dynamische Bibliotheken erforderlich).

Himanshu Mishra
quelle