Я начинающий 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 with ghc -c Plug.hs
, который создает Plug.o. Затем я компилирую Main.hs с помощью ghc -o Main Main.hs
и запускаю Main. Я также пытаюсь заменить load
на dynload
и работать с runhaskell
. Работает только одна из этих четырех комбинаций. Что я делаю неправильно?
- с
dynload
- compiled → печатает "Loaded", затем seg faults
- runhaskell → печатает "Загрузка", затем "Main.hs: Prelude.undefined"
- с
load
- compiled → успешно, печатает Integer
- runhaskell → печатает "Загрузка", зависает в течение 5-10 секунд, исчезает
Я нахожусь в Mac OS X. GHC версии 7.0.2. Что я делаю неправильно?
спасибо,
Rob
Update
Я могу исправить скомпилированный dynload
, изменив Plug.hs на следующее...
module Plug (thing) where
import Data.Dynamic
thing :: Dynamic
thing = toDyn (1234000::Integer)
Было бы неплохо, если бы не ошибка при ошибке. Я думаю, у него не хватает метаданных в Plug.o для проверки типа. Во всяком случае, это оставляет случаи runhaskell
. Я отправил ошибку для них.