Как отправить исполняемый файл с Language.Haskell.Interpreter?

136

Я надеялся встроить интерпретатор на 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
Майкл Фокс
источник
6
Я не могу воспроизвести эту проблему. Когда я бегу, PATH= ./TryHintвсе идет гладко: печатает несколько цифр, затем выходит. Я также использую GHC 7.8.3. Как вы строите TryHint?
Даниэль Вагнер
7
Я также полагаю, что это, вероятно, будет определенным для OSX. Вы можете открыть билет на GHC в трекере , как указано в сообщении об ошибке ( в конце концов, невозможно было просто так).
MasterMastic
5
Я понятия не имею, что происходит с этой ошибкой, но в любом случае GHC зависит от большого количества ресурсов, которые вы от него не скрываете PATH=., таких как файлы интерфейса для Prelude и все, что он транзитивно импортирует, фактические файлы библиотеки для base и ghc-prim и integer-gmp, а также settingsфайл GHC . (В основном, все, что установлено в /usr/lib/ghcили эквивалентный каталог для вашей установки.)
Рейд Бартон,
2
@MichaelFox, статически связывающий GHC API, не работает с новым динамическим компоновщиком, представленным в GHC 7.8, я думаю: | (интерактивное выполнение кода теперь требует динамических библиотек)
bennofs
2
@bennofs похоже, что ваш комментарий - почти ответ, если вы слегка перефразируете его!
SCLV

Ответы:

2

Судя по Language.Haskell.Interpreterвсему, доставка исполняемого файла в комплекте идёт идеально. Вы должны установить свой PATHскрипт, который хотите выполнить.

И как примечание, как упомянуто @bennofs в комментариях, статическое связывание API GHC не работает с новым динамическим компоновщиком, представленным в GHC 7.8 (для интерактивного выполнения кода теперь требуются динамические библиотеки).

Химаншу Мишра
источник