Tenía la esperanza de incrustar un intérprete de Haskell usando hintpara 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 PATHno causa un problema:
$ PATH=. Hello
Hello world
Sin embargo, un programa de prueba simple usando runInterpreterbombas 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 TryHintno 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 fa una función Test.hspara ser interpretada en tiempo de ejecución. Test.hsSe ve como esto:
module Test where
f :: Int -> Int
f x = x + 1

PATH= ./TryHinttodo 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 elsettingsarchivo GHC . (Básicamente, todo lo que se instala bajo/usr/lib/ghcel directorio equivalente para su instalación).Respuestas:
Enviar un archivo ejecutable con
Language.Haskell.Interpreterparece ser perfecto con la forma en que lo ha mostrado. Debe configurar suPATHen 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