GHC API を使用.hs
して、その場で複数のファイルをロードしようとしていました。と の 2 つの.hs
ファイルを作成test.hs
し、それらをフォルダーModule.hs
に入れました。/tmp
これら 2 つのファイルは非常に単純です。値を含むModule.hs
と呼ばれるモジュールを定義し、値をインポートしてそれ自体にコピーするモジュールを定義します。その内容を以下に示します。Module
Int
test.hs
Test
Module
Int
Module.hs
:
module Module (
value_in_module
) where
value_in_module = 1234 :: Int
test.hs
:
module Test (
value
) where
import Module
value = value_in_module
次に、別のファイルに、GHC API を呼び出してこれら 2 つのファイルをロードする次のコードを記述しました。
import Control.Applicative
import DynFlags
import GHC
import GHC.Paths
import MonadUtils (liftIO)
import Unsafe.Coerce
import SimplCore (core2core)
main = defaultErrorHandler defaultFatalMessager defaultFlushOut $
runGhc (Just libdir) $ do
env <- getSession
dflags <- getSessionDynFlags
setSessionDynFlags $ dflags { hscTarget = HscInterpreted, ghcLink = LinkInMemory }
setTargets =<< sequence [guessTarget "/tmp/Module.hs" Nothing, guessTarget "/tmp/test.hs" Nothing]
load LoadAllTargets
setContext [ IIModule $ mkModuleName "Test" ]
-- The following six lines are just for reproducing the warning.
modSum <- getModSummary $ mkModuleName "Test"
pmod <- parseModule modSum
tmod <- typecheckModule pmod
dmod <- desugarModule tmod
let core = coreModule dmod
core' <- liftIO $ core2core env core -- Warning happens here.
-- end
act <- unsafeCoerce <$> compileExpr "print value"
liftIO act
プログラムは実行されますが、次の出力が表示されます。
WARNING in hptSomeThingsBelowUs
missing module Module
Probable cause: out-of-date interface files
1234
プログラムは式 を正常に評価しprint value
、 を出力します1234
が、関数core2core
は上記の警告メッセージを出力します。一対のコメントの間の 6 行は、プログラムの残りの部分とは何の関係もないように見えます。これは、私が別のはるかに大きなプロジェクトから抽出した最小限の再現可能な例に過ぎないためです。また、警告メッセージはここでは問題ありませんが、そのプロジェクトではより深刻な問題を引き起こします。GHC API は十分に文書化されていないようで、多くの検索を行っても問題を解決できませんでした。警告メッセージの原因を説明し、GHC API を使用して複数のファイルを処理するのを手伝ってくれる人はいますか? 前もって感謝します。