J'espérais intégrer un interpréteur Haskell en utilisant hint
afin que je puisse écrire des plugins dans Haskell à utiliser avec mon programme. Je ne veux pas avoir à expédier toute la plate-forme Haskell pour mes exécutables.
Normalement, les exécutables Haskell sont assez autonomes. Par exemple, effacer le PATH
ne pose pas de problème:
$ PATH=. Hello
Hello world
Cependant, un simple programme de test utilisant des runInterpreter
bombes si j'efface le 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"
Quelles bibliothèques ou exécutables doivent être disponibles dans l'environnement pour que cela fonctionne?
otool
ne donne pas beaucoup d'indications:
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)
Le code de test pour TryHint
ne fait pas grand chose:
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]
Il se lie simplement f
à une fonction Test.hs
pour être interprété au moment de l'exécution. Test.hs
ressemble à ça:
module Test where
f :: Int -> Int
f x = x + 1
PATH= ./TryHint
tout se passe bien: il imprime quelques chiffres, puis sort. J'utilise également GHC 7.8.3. Comment construisez-vousTryHint
?PATH=.
, comme les fichiers d'interface pour Prelude et tout ce qu'il importe de manière transitoire, les fichiers de bibliothèque réels pour base et ghc-prim et integer-gmp, et lesettings
fichier GHC . (Fondamentalement, tout est installé sous/usr/lib/ghc
ou dans le répertoire équivalent pour votre installation.)Réponses:
L'expédition d'un exécutable avec
Language.Haskell.Interpreter
semble aller parfaitement avec la façon dont vous l'avez montré. Vous devez définir votrePATH
sur le script que vous souhaitez exécuter.De plus, comme mentionné par @bennofs dans les commentaires, la liaison statique de l'API GHC ne fonctionne pas avec le nouvel éditeur de liens dynamique introduit dans GHC 7.8 (l'exécution de code interactif nécessite désormais des bibliothèques dynamiques).
la source