18

我是 Haskell 初学者,我正在尝试使用“插件”包中的动态加载。我有点迷路了。这是一个包含两个文件的最小程序。

主要.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

我编译 Plugghc -c Plug.hs产生 Plug.o。然后我用 编译 Main.hsghc -o Main Main.hs并运行 Main。我也尝试用 替换loaddynload并用runhaskell. 这四种组合中只有一种有效。我究竟做错了什么?

  • dynload
    • 编译→打印“加载”,然后是段错误
    • runhaskell → 打印“Loading”,然后打印“Main.hs: Prelude.undefined”
  • load
    • 编译→成功,打印整数
    • runhaskell → 打印“Loading”,挂起 5-10 秒,消失

我在 Mac OS X 上。GHC 版本 7.0.2。我究竟做错了什么?

谢谢,
罗伯

更新

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

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

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

4

2 回答 2

3

我已经在带有 GHC 6.12.1 的 Ubuntu 10.10 下尝试了您的示例,结果是:两者dynloadload运行都符合或通过runhaskell给我“Prelude.undefined”错误,所以我认为您应该向开发人员报告错误。

我在他们模块的黑线鳕文档中看不到任何特殊情况或条件,所以我不认为你做错了什么。

于 2011-03-26T07:23:53.127 回答
1

您可能想看一下关于haskell ghc 动态编译的 GHC-API 的类似问题仅适用于第一次编译。

于 2013-01-24T11:51:23.090 回答