首页 文章

帮助Haskell动态插件加载

提问于
浏览
18

我是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 回答

  • 1

    我在Ubuntu 10.10下用GHC 6.12.1尝试了你的例子,结果是: dynloadload 都运行了编译或通过 runhaskell 给了我"Prelude.undefined"错误,所以我认为你应该向开发人员报告错误 .

    我在模块的haddock文档中看不到任何特殊情况或条件,所以我认为你做错了什么 .

  • 3

    你可能想看看haskell ghc dynamic compliation only works on first compile.上GHC-API的类似问题

相关问题