18

私は 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.hsPlug.o を生成する Plug をコンパイルします。次に、Main.hs をghc -o Main Main.hsでコンパイルし、Main を実行します。また、 に置き換えloaddynload、 で実行してみrunhaskellます。これら 4 つの組み合わせのうち 1 つだけが機能します。私は何を間違っていますか?

  • dynload
    • コンパイル済み→「ロード済み」を出力し、次にセグメントフォールト
    • runhaskell → "Loading" を出力し、次に "Main.hs: Prelude.undefined" を出力します
  • load
    • コンパイル済み → 成功、整数を出力
    • runhaskell → "Loading" を出力し、5 ~ 10 秒間ハングアップし、消える

Mac OS X. GHC バージョン 7.0.2 を使用しています。私は何を間違っていますか?

ありがとう、
ロブ

アップデート

dynloadPlug.hs を次のように変更することで、コンパイル済みを修正できます...

module Plug (thing) where
import Data.Dynamic                                                                                                    
thing :: Dynamic
thing = toDyn (1234000::Integer)

エラー時にフォルトをセグメント化しないとよいでしょう。タイプをチェックするのに十分なメタデータが Plug.o にないのだと思います。とにかく、それはrunhaskellケースを残します。私はそれらのためにバグを提出しました。

4

2 に答える 2

3

GHC 6.12.1を使用してUbuntu 10.10で例を試してみましたが、結果は次のとおりです。コンパイルまたはスルーの両方を実行するdynloadと、「Prelude.undefined」エラーが発生するため、開発者にバグを報告する必要があると思います。loadrunhaskell

モジュールのハドックのドキュメントに特別なケースや条件が見当たらないので、あなたが何か間違ったことをしているとは思いません。

于 2011-03-26T07:23:53.127 に答える
1

haskell ghc 動的コンパイルでGHC-API を使用した場合の同様の問題は、最初のコンパイルでのみ機能します。

于 2013-01-24T11:51:23.090 に答える