モジュールからコンパイルされたコードを動的にロードするためにGHCAPIを使用する既存のHaskell関数があります。これは、ブログ投稿「 Haskellでのモジュールの動的コンパイルとロード」のコードに基づいています。
コードはGHC7.0で正常に機能しますが、GHC APIが変更されたため、GHC7.2でコンパイルするには少し変更する必要がありました。
このコードは、GHC7.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)でオンラインで入手できます。
誰かがこの問題を修正または回避する方法を知っていますか?
また、これはGHC7.2での新しいSafeHaskellの変更が原因である可能性がありますか、それともGHC APIの変更が原因である可能性がありますか?