问题描述
我尝试使用 GHC API 动态加载多个 .hs
文件。我写了两个 .hs
文件,test.hs
和 Module.hs
,并将它们放入 /tmp
文件夹中。这两个文件非常简单。 Module.hs
定义了一个名为 Module
的模块,其中包含一个 Int
值,而 test.hs
定义了模块 Test
,它导入 Module
并复制 {{1 }} 对自身的价值。它们的内容如下所示。
Int
:
Module.hs
module Module (
value_in_module
) where
value_in_module = 1234 :: Int
:
test.hs
然后在另一个文件中,我编写了以下代码来调用 GHC API 并加载这两个文件。
module Test (
value
) where
import Module
value = value_in_module
程序运行,但输出如下。
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
发出了上面的警告消息。一对注释之间的六行似乎与程序的其余部分无关,因为这只是我从另一个更大的项目中提取的最小可重复示例。此外,警告消息在这里并没有什么坏处,但它会在该项目中引起更严重的问题。 GHC API 似乎没有很好的文档记录,所以经过大量搜索后我无法解决问题。谁能解释警告消息的原因,并帮助我使用 GHC API 处理多个文件?提前致谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)