gpt4 book ai didi

debugging - 让 "trace"像 "assert"一样优化?

转载 作者:行者123 更新时间:2023-12-03 14:40:25 25 4
gpt4 key购买 nike

GHC 重写 assert s 当优化为 id .或者,它的行为可以通过编译器标志来改变。但是,我注意到 trace 并没有发生同样的情况。 .有没有 trace 的版本最终结果为 id如果没有或设置了标志?

更一般地说,有没有办法根据用于编译调用模块的编译器标志(而不是用于编译自身的标志)来改变函数的行为。很像 assert做。还是只有 assert 才能实现的 GHC 魔法? ?

最佳答案

警告:我还没试过这个......

您可以替换 Debug.Trace完全带有编译器标志的模块。用 Debug.Trace 中的函数的简单实现制作另一个模块:

module NoTrace (trace) where:

trace :: String -> a -> a
{-# INLINE trace #-}
trace _message = id

...

将此模块放在另一个名为 no-trace 的包中.

隐藏 Debug.Trace including every module 提供给 ghc 的参数中的模块来自基本包,除了 Debug.Trace .替换 Debug.TraceNoTrace来自 no-trace包裹。
ghc -package="base (Control, Control.Applicative, ..., Data.Word, Foreign, ...)" \
-package="no-trace (NoTrace as Debug.Trace)" \
...

这来自一个疯狂的想法,即使用编译器标志更改前奏以将前奏替换为具有 rewrite rules 的前奏。删除 trace s,但是那些重写规则会污染任何导入使用它们编译的模块的东西,即使下游导入器仍然想使用跟踪。在查找如何替换前奏时,我发现 ghc 可以替换任何模块。

关于debugging - 让 "trace"像 "assert"一样优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40734253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com