帮助Haskell动态插件加载

时间:2011-03-25 02:02:33

标签: plugins haskell dynamic-loading

我是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

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

  • dynload
    • 编译→打印“已加载”,然后出现seg fault
    • runhaskell→打印“正在加载”,然后“Main.hs:Prelude.undefined”
  • load
    • 编译→成功,打印整数
    • runhaskell→打印“正在加载”,挂起5-10秒,消失

我使用的是Mac OS X. GHC 7.0.2版。我做错了什么?

感谢,
罗布

更新

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

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

如果错误没有出错,那就太好了。我猜它在Plug.o中没有足够的元数据来检查类型。无论如何,这留下了runhaskell个案例。我为那些人提交了bug

2 个答案:

答案 0 :(得分:3)

我在Ubuntu 10.10下使用GHC 6.12.1尝试了你的例子,结果是:dynloadload同时运行已经编译或通过runhaskell给我“Prelude。未定义“错误,所以我认为你应该向开发人员报告错误。

我在模块的haddock文档中看不到任何特殊情况或条件,所以我认为你没有做错任何事。

答案 1 :(得分:1)

你可能想看看haskell ghc dynamic compliation only works on first compile.上的GHC-API的类似问题