Haskell动态插件加载帮助

18

我是一个Haskell初学者,试图在“plugins”包中使用动态加载功能。但我有点迷失方向。这里有一个用两个文件组成的最小程序。

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,生成了 Plug.o 文件。 然后我使用 ghc -o Main Main.hs 编译 Main.hs,并运行 Main。 我还尝试将 load 替换为 dynload,并使用 runhaskell 运行。这四种组合中只有一种有效。 我做错了什么?

  • 使用 dynload
    • 编译 → 打印 "Loaded",然后段错误
    • runhaskell → 打印 "Loading",然后 "Main.hs: Prelude.undefined"
  • 使用 load
    • 编译 → 成功,打印整数
    • runhaskell → 打印 "Loading",等待 5-10 秒钟,然后消失

我的操作系统是 Mac OS X,GHC 版本是 7.0.2。 我做错了什么?

谢谢!
Rob

更新

我可以通过将 Plug.hs 更改为以下内容来修复已编译的 dynload...

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

如果它在错误时不会发生段错误就好了。我猜在Plug.o中没有足够的元数据来检查类型。无论如何,这还剩下runhaskell的情况。我已经为此提交了bug

2个回答

3
我在Ubuntu 10.10下使用GHC 6.12.1尝试了你的示例,结果是:无论是编译还是通过runhaskell运行,dynloadload都会出现“Prelude.undefined”错误,因此我认为你应该向开发人员报告这个bug。
我没有在他们模块的haddock文档中看到任何特殊情况或条件,所以我不认为你做错了什么。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接