2
我创建了一个简单的模块TestModule.hs
,它包含一个导出的顶级定义testval = 2
。我编译它,创建TestModule.o
和TestModule.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
包完成同样的事情?
谢谢!
如果解释是从源头发生的,那么也是如此。但是大多数现代的“解释器”都是从中间表示中解释出来的,比如字节码。我想我读GHCi也是这样做的,我不认为它不应该这样做。你有没有其他的消息来源? – delnan
GHC从不保存它解释的字节码。 – augustss
使用GHC API,我可以仅使用.o和.hi文件(删除.hs文件)获取导出的顶级定义后面的值。因此,获得这个价值在我看来完全可能。我只需要弄清楚如何使用ghci或hint来做同样的事情。 –