2011-09-17 40 views
2

我创建了一个简单的模块TestModule.hs,它包含一个导出的顶级定义testval = 2。我编译它,创建TestModule.oTestModule.hi。我删除TestModule.hs。然后,我在ghci加载TestModule.o,像这样:使用GHCi加载模块而不访问其源代码

~ λ ghci TestModule.o 
GHCi, version 7.0.3.20110517: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Loading package ffi-1.0 ... linking ... done. 
Loading object (static) TestModule.o ... done 
final link ... done 
Prelude> 

正如你所看到的,TestModule不在范围内,我不能访问testval。为什么?如何在不访问源文件的情况下完成此操作?

附加问题:如何使用hint包完成同样的事情?

谢谢!

回答

2

你不能解释已经编译好的东西。如果你想解释它,你需要来源。如果你喜欢,你可以制作一个包装。说明是here

+0

如果解释是从源头发生的,那么也是如此。但是大多数现代的“解释器”都是从中间表示中解释出来的,比如字节码。我想我读GHCi也是这样做的,我不认为它不应该这样做。你有没有其他的消息来源? – delnan

+0

GHC从不保存它解释的字节码。 – augustss

+0

使用GHC API,我可以仅使用.o和.hi文件(删除.hs文件)获取导出的顶级定义后面的值。因此,获得这个价值在我看来完全可能。我只需要弄清楚如何使用ghci或hint来做同样的事情。 –

相关问题