haskell module ghc dynamic-loading ghc-api

API de GHC: ¿Cómo cargar dinámicamente el código Haskell desde un módulo compilado usando GHC 7.2?



module dynamic-loading (2)

El contexto del módulo actual está reservado para los módulos que se están compilando actualmente, es decir, cuando especifica módulos en el contexto, no deben ser explícitamente externos.

En su lugar, debe especificar el módulo deseado como una importación, en el segundo argumento de setContext . Esto se puede hacer así:

GHC.setContext [] -- import qualified Module [ (GHC.simpleImportDecl . GHC.mkModuleName $ moduleName) { GHC.ideclQualified = True } -- -- import qualified Data.Dynamic -- , (GHC.simpleImportDecl . GHC.mkModuleName $ "Data.Dynamic") -- { GHC.ideclQualified = True -- } ] fetched <- GHC.compileExpr $ moduleName ++ "." ++ externalFuncName return . unsafeCoerce $ fetched -- or: -- fetched <- GHC.dynCompileExpr $ moduleName ++ "." ++ externalFuncName -- return . fromDynamic (error "Illegal type cast") $ fetched

PD : podría ser una buena idea usar GHC.dynCompileExpr en GHC.dynCompileExpr lugar, para que pueda evitar el unsafeCoerce . Debe agregar una importación calificada para Data.Dynamic en el contexto para que funcione, pero un valor Data.Dynamic.Dynamic generalmente es más agradable para trabajar, ya que puede manejar los errores de tipo con mayor gracia. He añadido el código para eso como comentarios en el código anterior.

Actualizar

Y aquí está la sintaxis de GHC 7.4.1:

GHC.setContext -- import qualified Module [ GHC.IIDecl $ (GHC.simpleImportDecl . GHC.mkModuleName $ moduleName) {GHC.ideclQualified = True} ]

Tengo una función de Haskell existente que utiliza la API de GHC para cargar dinámicamente el código compilado desde un módulo. Se basa en el código de la publicación del blog Compilación dinámica y carga de módulos en Haskell .

El código funciona bien en GHC 7.0, pero tuvo que ser modificado ligeramente para compilar en GHC 7.2, porque la API de GHC cambió.

El código ahora arroja un error de tiempo de ejecución en GHC 7.2:

mkTopLevEnv: not a home module (module name):(function name)

El codigo 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)

Para referencia, el código completo está disponible en línea en FFI.hs (github.com) .

¿Alguien tiene alguna idea de cómo solucionar o solucionar este problema?

Además, ¿esto podría deberse a los nuevos cambios de Safe Haskell en GHC 7.2, o solo se debe a modificaciones en la API de GHC?