【发布时间】:2022-01-15 18:42:12
【问题描述】:
CPP 扩展允许条件编译,例如
{-# LANGUAGE CPP #-}
#ifdef DEBUG
-- some debug code
#endif
当然,它工作得很好,但它相当笨拙且不惯用。难道真的没有其他机制可以实现条件编译吗?
(我真正想使用它的具体情况是Text.Megaparsec.Debug.dbg 函数。它产生的解析线索非常有用,但是源代码中到处都是#ifdef...#endif 噪音,这使得这一切都相当不可读。顶部的包装函数会消除大部分噪音,但我还是想知道。)
【问题讨论】:
-
我想说CPP是实现条件编译的常用方式。我还要说,目前,CPP 是惯用的方式。另一种选择是 Template Haskell,在某些情况下,它可以用于该目的,但我从未见过它被这样使用。
-
另一个可能的选择是使用背包。将调试函数放在模块签名中,然后编写两个带有实现的内部库:一个是无操作的,另一个是委托真正的调试函数。
标签: haskell c-preprocessor conditional-compilation