Language.Haskell.Interpreter で実行ファイルを配布するにはどうすればいいですか? 質問する

Language.Haskell.Interpreter で実行ファイルを配布するにはどうすればいいですか? 質問する

私は、プログラムで使用するために Haskell でプラグインを作成できるように、 を使用して Haskell インタープリターを埋め込みたいと考えていましたhint。実行可能ファイル用に 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.hsTest.hs

module Test where
f :: Int -> Int
f x = x + 1

ベストアンサー1

実行可能ファイルを で配布することは、Language.Haskell.Interpreterあなたが示した方法で完璧に機能するようです。PATHを実行するスクリプトに を設定する必要があります。

なお、コメントで @bennofs が述べているように、GHC API の静的リンクは、GHC 7.8 で導入された新しい動的リンカーでは機能しません (対話型コードの実行には動的ライブラリが必要になりました)。

おすすめ記事