Я надеялся встроить интерпретатор на Haskell, hint
чтобы я мог написать плагины на Haskell для использования с моей программой. Я не хочу отправлять всю платформу Haskell для моих исполняемых файлов.
Обычно исполняемые файлы Haskell довольно автономны. Например, удаление PATH
не вызывает проблемы:
$ PATH=. Hello
Hello world
Тем не менее, простая тестовая программа с использованием runInterpreter
бомб, если я сотру 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"
Какие библиотеки или исполняемые файлы должны быть доступны в среде для его работы?
otool
не дает большого руководства:
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)
Тестовый код TryHint
не делает много:
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]
Он просто привязывается f
к функции, Test.hs
которая будет интерпретироваться во время выполнения. Test.hs
выглядит так:
module Test where
f :: Int -> Int
f x = x + 1
PATH= ./TryHint
все идет гладко: печатает несколько цифр, затем выходит. Я также использую GHC 7.8.3. Как вы строитеTryHint
?PATH=.
, таких как файлы интерфейса для Prelude и все, что он транзитивно импортирует, фактические файлы библиотеки для base и ghc-prim и integer-gmp, а такжеsettings
файл GHC . (В основном, все, что установлено в/usr/lib/ghc
или эквивалентный каталог для вашей установки.)Ответы:
Судя по
Language.Haskell.Interpreter
всему, доставка исполняемого файла в комплекте идёт идеально. Вы должны установить свойPATH
скрипт, который хотите выполнить.И как примечание, как упомянуто @bennofs в комментариях, статическое связывание API GHC не работает с новым динамическим компоновщиком, представленным в GHC 7.8 (для интерактивного выполнения кода теперь требуются динамические библиотеки).
источник