我是一个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。