plugins - Ayuda con la carga del complemento dinámico de Haskell
dynamic-loading (2)
Es posible que desee echar un vistazo a un problema similar con el GHC-API en haskell ghc dynamic compliation que solo funciona en la primera compilación.
Soy un principiante de Haskell, y estoy tratando de usar la carga dinámica en el paquete de ''complementos''. Estoy un poco perdido. Aquí hay un programa mínimo con dos archivos.
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)
Y Plug.hs:
module Plug (thing) where
thing :: Integer
thing = 1234000
ghc -c Plug.hs
Plug con ghc -c Plug.hs
que produce Plug.o. Luego compilo Main.hs con ghc -o Main Main.hs
, y ejecuto Main. También trato de reemplazar load
con dynload
, y correr con runhaskell
. Solo una de estas cuatro combinaciones funciona. ¿Qué estoy haciendo mal?
- con
dynload
- compilado → imprime "Cargado", luego seg fallos
- runhaskell → imprime "Cargando", luego "Main.hs: Prelude.undefined"
- con
load
- compilado → exitoso, imprime el entero
- runhaskell → imprime "Cargando", se cuelga durante 5-10 segundos, desaparece
Estoy en Mac OS X. GHC versión 7.0.2. ¿Qué estoy haciendo mal?
Gracias,
Robar
Actualizar
Puedo arreglar el dynload
compilado cambiando Plug.hs a lo siguiente ...
module Plug (thing) where
import Data.Dynamic
thing :: Dynamic
thing = toDyn (1234000::Integer)
Sería bueno si no falla por error. Supongo que no tiene suficientes metadatos en Plug.o para verificar el tipo. De todos modos, eso deja los casos de runhaskell
. Presenté un bug para esos.
He intentado su ejemplo en Ubuntu 10.10 con GHC 6.12.1 y los resultados son: tanto dynload
como load
con runhaskell
o runhaskell
fallado el error "Prelude.undefined", así que creo que debería informar un error a los desarrolladores .
No puedo ver ningún caso ni condición especial en la documentación de haddock su módulo, por lo que no creo que esté haciendo nada mal.