我试图使用 GHC API 动态加载多个.hs
文件。我写了两个.hs
文件,test.hs
和Module.hs
,并将它们放入/tmp
文件夹中。这两个文件非常简单。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 并加载这两个文件。
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
发出了上面的警告消息。一对注释之间的六行似乎与程序的其余部分无关,因为这只是我从另一个更大的项目中提取的一个最小的可重现示例。警告信息在这里也没有什么坏处,但它会在该项目中引起更严重的问题。GHC API 似乎没有很好的文档记录,所以经过大量搜索后我无法解决问题。谁能解释警告消息的原因,并帮助我使用 GHC API 处理多个文件?提前致谢。