我是一个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。我还尝试用dynload
替换load
,并使用runhaskell
运行。这四种组合中只有一种是有效的。我做错了什么?
dynload
”,然后是seg faults
load
我使用的是MacOSX.GHC 7.0.2版。我做错了什么?
谢谢,
抢夺
更新
我可以通过将Plug.hs更改为以下代码来修复已编译的dynload
...
module Plug (thing) where
import Data.Dynamic
thing :: Dynamic
thing = toDyn (1234000::Integer)
如果它不会在错误中显示错误,那就太好了。我猜它在Plug.o中没有足够的元数据来检查类型。不管怎样,剩下runhaskell
的案子了。我为这些东西提交了bug。
发布于 2011-03-26 15:23:53
我已经在Ubuntu10.10和GHC6.12.1上测试了你的例子,结果是:无论是编译的还是通过runhaskell
运行的dynload
和load
都会给我一个"Prelude.undefined“错误,所以我认为你应该向开发人员报告一个错误。
我在他们模块的haddock文档中看不到任何特殊情况或条件,所以我不认为您做错了什么。
发布于 2013-01-24 19:51:23
您可能希望查看haskell ghc dynamic compliation only works on first compile.上的GHC-API的类似问题。
https://stackoverflow.com/questions/5427777
复制相似问题