我是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 . 我也尝试用 dynload
替换 load
,并用 runhaskell
运行 . 这四种组合中只有一种有效 . 我究竟做错了什么?
-
with
dynload
-
编译→打印"Loaded",然后seg故障
-
runhaskell→打印"Loading",然后"Main.hs: Prelude.undefined"
-
with
load
-
编译→成功,打印整数
-
runhaskell→打印"Loading",挂起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 回答
我在Ubuntu 10.10下用GHC 6.12.1尝试了你的例子,结果是:
dynload
和load
都运行了编译或通过runhaskell
给了我"Prelude.undefined"错误,所以我认为你应该向开发人员报告错误 .我在模块的haddock文档中看不到任何特殊情况或条件,所以我认为你做错了什么 .
你可能想看看haskell ghc dynamic compliation only works on first compile.上GHC-API的类似问题