Tengo una función Haskell existente que usa la API GHC para cargar dinámicamente el código compilado de un módulo. Se basa en el código de la entrada del blog Dynamic Compilation and Loading of Modules in Haskell.GHC API - ¿Cómo cargar dinámicamente el código Haskell desde un módulo compilado utilizando GHC 7.2?
El código funciona bien en GHC 7.0, pero tuvo que modificarse ligeramente para compilarse en GHC 7.2, porque la API de GHC cambió.
Ahora, el código genera un error en tiempo de ejecución en GHC 7.2:
mkTopLevEnv: not a home module (module name):(function name)
El código es
evalfuncLoadFFI String moduleName,
String externalFuncName,
String internalFuncName = do
result <- liftIO $ defaultRunGhc $ do
dynflags <- GHC.getSessionDynFlags
_ <- GHC.setSessionDynFlags dynflags
m <- GHC.findModule (GHC.mkModuleName moduleName) Nothing
--------------------------------------------------------
-- The following code works fine in GHC 7.0.4:
--
-- GHC.setContext [] [(m, Nothing)]
--
-- This new code attempts to set context to the module,
-- but throws an error in GHC 7.2:
--
(_,oi) <- GHC.getContext
GHC.setContext [m] oi
--------------------------------------------------------
fetched <- GHC.compileExpr (moduleName ++ "." ++ externalFuncName)
return (Unsafe.Coerce.unsafeCoerce fetched :: [LispVal] -> IOThrowsError LispVal)
defineVar env internalFuncName (IOFunc result)
Como referencia, el código completo está disponible en línea en FFI.hs (github.com).
¿Alguien tiene alguna idea de cómo solucionar este problema o solucionar este problema?
Además, ¿podría deberse a los nuevos cambios de Safe Haskell en GHC 7.2, o es solo debido a modificaciones en la API de GHC?
Eso funcionó perfectamente. ¡Gracias por la sintaxis adecuada y la explicación detallada! Disfruta de tu generosidad :) –
También agregué la sintaxis para GHC 7.4.1 en caso de que pueda beneficiar a alguien más. –