Як відправити виконуваний файл з 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або еквівалентний каталог для вашої установки.)
Reid Barton

2
@MichaelFox статично пов’язує API GHC не працює з новим динамічним лінкером, введеним у GHC 7.8, я думаю: | (для інтерактивного виконання коду зараз потрібні динамічні бібліотеки)
bennofs

2
@bennofs, схоже, ваш коментар - це майже відповідь, якщо ви трохи переробите його!
sclv

Відповіді:


2

Доставка виконуваного файлу, Language.Haskell.Interpreterздається, ідеально підходить так, як ви показали. Ви повинні встановити свій PATHсценарій, який ви хочете виконати.

І як зауваження, як згадує @bennofs у коментарях, статичне з'єднання API GHC не працює з новим динамічним лінкером, запровадженим у GHC 7.8 (для інтерактивного виконання коду зараз потрібні динамічні бібліотеки).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.