我是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
load
我使用的是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。
答案 0 :(得分:3)
我在Ubuntu 10.10下使用GHC 6.12.1尝试了你的例子,结果是:dynload
和load
同时运行已经编译或通过runhaskell
给我“Prelude。未定义“错误,所以我认为你应该向开发人员报告错误。
我在模块的haddock文档中看不到任何特殊情况或条件,所以我认为你没有做错任何事。
答案 1 :(得分:1)
你可能想看看haskell ghc dynamic compliation only works on first compile.上的GHC-API的类似问题