Tenía la esperanza de incrustar un intérprete de Haskell usando hint
para poder escribir complementos en Haskell para usar con mi programa. No quiero tener que enviar toda la plataforma Haskell para mis ejecutables.
Normalmente, los ejecutables de Haskell son bastante independientes. Por ejemplo, borrar el PATH
no causa un problema:
$ PATH=. Hello
Hello world
Sin embargo, un programa de prueba simple usando runInterpreter
bombas si borro el 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"
¿Qué bibliotecas o ejecutables deben estar disponibles en el entorno para que funcione?
otool
no da mucha orientación:
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)
El código de prueba para TryHint
no hace mucho:
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]
Simplemente se une f
a una función Test.hs
para ser interpretada en tiempo de ejecución. Test.hs
Se ve como esto:
module Test where
f :: Int -> Int
f x = x + 1
PATH= ./TryHint
todo funciona sin problemas: imprime algunos números y luego sale. También estoy usando GHC 7.8.3. ¿Cómo estás construyendoTryHint
?PATH=.
, como los archivos de interfaz para Prelude y todo lo que importa transitivamente, los archivos de biblioteca reales para base y ghc-prim y integer-gmp, y elsettings
archivo GHC . (Básicamente, todo lo que se instala bajo/usr/lib/ghc
el directorio equivalente para su instalación).Respuestas:
Enviar un archivo ejecutable con
Language.Haskell.Interpreter
parece ser perfecto con la forma en que lo ha mostrado. Debe configurar suPATH
en el script que desea ejecutar.Y como nota al margen, como lo mencionó @bennofs en los comentarios, enlazar estáticamente la API de GHC no funciona con el nuevo vinculador dinámico introducido en GHC 7.8, (la ejecución de código interactivo ahora requiere bibliotecas dinámicas).
fuente