Eu esperava incorporar um intérprete Haskell usando hint
para que eu pudesse escrever plugins no Haskell para usar com o meu programa. Não quero ter que enviar toda a plataforma Haskell para meus executáveis.
Normalmente, os executáveis Haskell são bem independentes. Por exemplo, apagar o arquivo PATH
não causa problemas:
$ PATH=. Hello
Hello world
No entanto, um programa de teste simples usando runInterpreter
bombas se eu apagar o 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"
Quais bibliotecas ou executáveis precisam estar disponíveis no ambiente para que funcionem?
otool
não dá muita orientação:
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)
O código de teste para TryHint
não faz muito:
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]
Apenas se liga f
a uma função Test.hs
para ser interpretada em tempo de execução. Test.hs
se parece com isso:
module Test where
f :: Int -> Int
f x = x + 1
PATH= ./TryHint
tudo corre bem: ele imprime alguns números e sai. Também estou usando o GHC 7.8.3. Como você está construindoTryHint
?PATH=.
, como os arquivos de interface do Prelude e tudo o que importa transitivamente, os arquivos de biblioteca reais para base e ghc-prim e integer-gmp, e osettings
arquivo GHC . (Basicamente, tudo instalado sob/usr/lib/ghc
ou o diretório equivalente para a sua instalação.)Respostas:
O envio de um executável com
Language.Haskell.Interpreter
parece ser perfeito da maneira que você mostrou. Você precisa definir o seuPATH
como o script que deseja executar.E como nota lateral, como mencionado por @bennofs nos comentários, vincular estaticamente a API do GHC não funciona com o novo vinculador dinâmico introduzido no GHC 7.8 (a execução interativa de código agora requer bibliotecas dinâmicas).
fonte