私のプログラムで使用するプラグインを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
Language.Haskell.Interpreter
で実行可能ファイルを出荷することは、あなたが示した方法で完全にうまくいくようです。 PATH
を実行するスクリプトに設定する必要があります。
補足として、@ bennofsのコメントで言及されているように、GHC APIを静的にリンクすることは、GHC 7.8で導入された新しい動的リンカーでは機能しません(対話型コードの実行には動的ライブラリが必要です)。