私は Haskell の初心者で、「プラグイン」パッケージで動的読み込みを使用しようとしています。私はちょっと迷っています。以下は、2 つのファイルを持つ最小限のプログラムです。
Main.hs:
module Main (main) where
import System.Plugins
main :: IO ()
main = do
putStrLn "Loading"
mv <- dynload "Plug.o" [] [] "thing" -- also try 'load' here
putStrLn "Loaded"
case mv of
LoadFailure msgs -> putStrLn "fail" >> print msgs
LoadSuccess _ v -> putStrLn "success" >> print (v::Integer)
そして Plug.hs:
module Plug (thing) where
thing :: Integer
thing = 1234000
ghc -c Plug.hs
Plug.o を生成する Plug をコンパイルします。次に、Main.hs をghc -o Main Main.hs
でコンパイルし、Main を実行します。また、 に置き換えload
てdynload
、 で実行してみrunhaskell
ます。これら 4 つの組み合わせのうち 1 つだけが機能します。私は何を間違っていますか?
- と
dynload
- コンパイル済み→「ロード済み」を出力し、次にセグメントフォールト
- runhaskell → "Loading" を出力し、次に "Main.hs: Prelude.undefined" を出力します
- と
load
- コンパイル済み → 成功、整数を出力
- runhaskell → "Loading" を出力し、5 ~ 10 秒間ハングアップし、消える
Mac OS X. GHC バージョン 7.0.2 を使用しています。私は何を間違っていますか?
ありがとう、
ロブ
アップデート
dynload
Plug.hs を次のように変更することで、コンパイル済みを修正できます...
module Plug (thing) where
import Data.Dynamic
thing :: Dynamic
thing = toDyn (1234000::Integer)
エラー時にフォルトをセグメント化しないとよいでしょう。タイプをチェックするのに十分なメタデータが Plug.o にないのだと思います。とにかく、それはrunhaskell
ケースを残します。私はそれらのためにバグを提出しました。