Подтвердить что ты не робот

Где утверждают магические правила для GHC?

http://hackage.haskell.org/package/base-4.6.0.1/docs/src/GHC-Base.html#assert, похоже, определяет assert как no-op. Где логика, которая превращает это во что-то другое, когда утверждения разрешены?

4b9b3361

Ответ 1

Комментарий выше этой функции дает подсказку:

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

Итак, просто используйте поиск кода github и найдите assertError: результаты поиска

Появится файл RnExpr.lhs. Поиск утверждения в этом файле, вы найдете следующий код:

finishHsVar :: Name -> RnM (HsExpr Name, FreeVars)
-- Separated from rnExpr because it 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