【问题标题】:Using GHCi to load a module without access to its source code使用 GHCi 加载模块而不访问其源代码
【发布时间】:2011-11-19 08:35:37
【问题描述】:

我创建了一个简单的模块TestModule.hs,其中包含一个导出的顶级定义testval = 2。我编译它,创建TestModule.oTestModule.hi。我删除 TestModule.hs。然后我在ghci 中加载TestModule.o,如下所示:

~ λ 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 包完成同样的事情?

谢谢!

【问题讨论】:

    标签: haskell ghci hint


    【解决方案1】:

    你不能解释已经编译的东西。如果你想解释它,你需要源代码。如果你愿意,你可以做一个包。说明是here

    【讨论】:

    • 如果从源头进行解释,那就是真的。但是大多数现代“解释器”从中间表示解释,例如字节码。我想我读过 GHCi 也是这样做的,我看不出它不应该这样做的原因。你有其他说法的消息来源吗?
    • 使用 GHC API,我可以仅使用 .o 和 .hi 文件(删除 .hs 文件)来获取导出的顶级定义背后的值。所以,在我看来,获得这个价值是完全可能的。我只需要弄清楚如何使用 ghci 或提示来做同样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 2018-10-14
    • 2023-03-09
    相关资源
    最近更新 更多