0

GHC API を使用.hsして、その場で複数のファイルをロードしようとしていました。と の 2 つの.hsファイルを作成test.hsし、それらをフォルダーModule.hsに入れました。/tmpこれら 2 つのファイルは非常に単純です。値を含むModule.hsと呼ばれるモジュールを定義し、値をインポートしてそれ自体にコピーするモジュールを定義します。その内容を以下に示します。ModuleInttest.hsTestModuleInt

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 を使用して複数のファイルを処理するのを手伝ってくれる人はいますか? 前もって感謝します。

4

0 に答える 0