GHC APIを使用してHaskellモジュールを動的にコンパイルしてロードしようとしています。私は、APIがあるバージョンから別のバージョンにかなり変動していることを理解していますので、具体的にGHC 7.6についてお話しています*。動的にコンパイルされたHaskellモジュールをロードする - GHC 7.6
MacOSとLinuxで同じコードを実行しようとしました。どちらの場合も、Pluginモジュールは正常にコンパイルされますが、ロード時に次のエラーが発生します。thisの問題は、モジュールがホストプログラムの同じ実行でコンパイルされた場合にのみロードされます。
-- Host.hs: compile with ghc-7.6.*
-- $ ghc -package ghc -package ghc-paths Host.hs
-- Needs Plugin.hs in the same directory.
module Main where
import GHC
import GHC.Paths (libdir)
import DynFlags
import Unsafe.Coerce
main :: IO()
main =
defaultErrorHandler defaultFatalMessager defaultFlushOut $ do
result <- runGhc (Just libdir) $ do
dflags <- getSessionDynFlags
setSessionDynFlags dflags
target <- guessTarget "Plugin.hs" Nothing
setTargets [target]
r <- load LoadAllTargets
case r of
Failed -> error "Compilation failed"
Succeeded -> do
setContext [IIModule (mkModuleName "Plugin")]
result <- compileExpr ("Plugin.getInt")
let result' = unsafeCoerce result :: Int
return result'
print result
し、プラグイン:
-- Plugin.hs
module Plugin where
getInt :: Int
getInt = 33