Ich hatte gehofft, einen Haskell-Interpreter mit einbetten zu können, hint
damit 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 PATH
verursacht beispielsweise kein Problem:
$ PATH=. Hello
Hello world
Ein einfaches Testprogramm mit runInterpreter
Bomben, 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 TryHint
macht 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 f
eine Funktion Test.hs
gebunden, die zur Laufzeit interpretiert werden soll. Test.hs
sieht aus wie das:
module Test where
f :: Int -> Int
f x = x + 1
PATH= ./TryHint
alles reibungslos: Es werden einige Zahlen gedruckt und dann beendet. Ich benutze auch GHC 7.8.3. Wie baust duTryHint
?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-settings
Datei. (Grundsätzlich alles installiert unter/usr/lib/ghc
oder das entsprechende Verzeichnis für Ihre Installation.)Antworten:
Der Versand einer ausführbaren Datei mit
Language.Haskell.Interpreter
scheint perfekt zu der von Ihnen gezeigten Art zu passen. Sie müssenPATH
das 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).
quelle