【问题标题】:Where are the magic rules for GHC assert?GHC 断言的神奇规则在哪里?
【发布时间】:2014-04-10 19:03:34
【问题描述】:

http://hackage.haskell.org/package/base-4.6.0.1/docs/src/GHC-Base.html#assert 似乎将assert 定义为无操作。启用断言时,将其转换为其他内容的逻辑在哪里?

【问题讨论】:

  • 它的编译器魔法与lazybreakpoint 相同。可能在 GHC 中有一个特殊情况。

标签: haskell ghc assertions


【解决方案1】:

该函数上方的注释给出了提示:

-- Assertion function.  This simply ignores its boolean argument.
-- The compiler may rewrite it to @('assertError' line)@.

所以,只要使用github代码搜索,搜索assertErrorsearch results

这会打开文件RnExpr.lhs。在这个文件中搜索assert,你会发现如下代码:

finishHsVar :: Name -> RnM (HsExpr Name, FreeVars)
-- Separated from rnExpr because it's also used
-- when renaming infix expressions
-- See Note [Adding the implicit parameter to 'assert']
finishHsVar name
 = do { this_mod <- getModule
      ; when (nameIsLocalOrFrom this_mod name) $
        checkThLocalName name

      ; ignore_asserts <- goptM Opt_IgnoreAsserts
      ; if ignore_asserts || not (name `hasKey` assertIdKey)
        then return (HsVar name, unitFV name)
        else do { e <- mkAssertErrorExpr
                ; return (e, unitFV name) } }

这就是它将assert 替换为assertError 的地方,但前提是启用了断言。 assertError 定义在GHC.IO.Exception

【讨论】:

  • 有趣。有没有理由不能更通用地处理?我认为一个显式的 RULE 编译指示包裹在预处理器魔法中,测试 GHC 忽略断言选项会更容易理解。
  • @dfeuer 这会更容易理解,但 ghc 也会将 assert 重写为 assertError + 位置信息。 RULE pragma 无法获取此位置信息。我什至不确定RULE pragma 是否可以检查 GHC 优化标志。
  • 我建议 RULE 根据标志有条件地编译。我也不知道这是否可能,但在某些情况下,即使是 CPP 也能做到这一点。位置信息似乎通常很有用——为什么不用一个神奇的“位置”函数来扩展它出现的位置信息?
猜你喜欢
  • 2011-09-26
  • 1970-01-01
  • 2011-09-24
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多