У меня есть функция Haskell, которая использует GHC API для динамической загрузки скомпилированного кода из модуля. Он основан на коде из блога Динамическая компиляция и загрузка модулей в Haskell .
Код прекрасно работает в GHC 7.0, но его пришлось слегка изменить, чтобы скомпилировать в GHC 7.2, поскольку изменился API GHC.
Код теперь выдает ошибку времени выполнения в GHC 7.2:
mkTopLevEnv: not a home module (module name):(function name)
Код
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)
Для справки, полный код доступен онлайн в FFI.hs (github.com) .
Кто-нибудь знает, как исправить или обойти эту проблему?
Кроме того, это может быть вызвано новыми изменениями Safe Haskell в GHC 7.2, или это просто из-за изменений в API GHC?