CPP扩展允许条件编译,例如
{-# LANGUAGE CPP #-}
#ifdef DEBUG
-- some debug code
#endif
当然,它很好用,但它很笨拙,也不地道。真的没有其他机制来实现条件编译吗?
(我真正想使用它的具体情况是Text.Megaparsec.Debug.dbg函数。它生成的解析跟踪非常有用,但源代码中充斥着#ifdef
…#endif
噪音,这让它变得很难阅读。顶部的包装器函数可以去除大部分噪音,但我还是想知道。(
轻量级解决方案是只使用CPP一次来定义布尔值,然后可以在常规Haskell代码中使用:
#ifdef DEBUG
#define debug True
#else
#define debug False
#fi
或者宏,如果您甚至不希望调试代码经过类型检查。
在没有CPP的情况下进行条件编译的另一种方法是在包级别更改模块的源,尽管我不知道这方面的任何实际示例。
创建两个具有相同名称debug/Debug.hs
和nodebug/Debug.hs
的模块,例如,这两个模块都导出一个布尔debug :: Bool
。
在包配置中,添加一个标志以在debug/
和nodebug/
之间进行选择。
flag debug
description: debug mode
default: False
manual: True
library
...
if flag(debug)
hs-source-dirs: debug
else
hs-source-dirs: nodebug
现在,您可以使用-f +debug
构建库以启用调试。