¿Cómo enviar un ejecutable con Language.Haskell.Interpreter?

136

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
Michael Fox
fuente
66
No puedo reproducir este problema. Cuando ejecuto, PATH= ./TryHinttodo funciona sin problemas: imprime algunos números y luego sale. También estoy usando GHC 7.8.3. ¿Cómo estás construyendo TryHint?
Daniel Wagner el
77
También creo que es probable que sea específico de OSX. Es posible que desee abrir un ticket en GHC del rastreador como se menciona en el mensaje de error (después de todo, lo imposible se hicieron simplemente suceda).
MasterMastic
55
No tengo idea de lo que está sucediendo con ese error, pero en cualquier caso GHC depende de muchos recursos con los que no se está ocultando 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 el settingsarchivo GHC . (Básicamente, todo lo que se instala bajo /usr/lib/ghcel directorio equivalente para su instalación).
Reid Barton
2
@MichaelFox enlazar estáticamente la API de GHC no funciona con el nuevo enlazador dinámico introducido en GHC 7.8, creo: | (la ejecución de código interactivo ahora requiere bibliotecas dinámicas)
bennofs
2
@bennofs parece que su comentario es casi una respuesta si lo modifica ligeramente.
sclv

Respuestas:

2

Enviar un archivo ejecutable con Language.Haskell.Interpreterparece ser perfecto con la forma en que lo ha mostrado. Debe configurar su PATHen 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).

Himanshu Mishra
fuente