Haskell中的条件编译,而不是使用CPP



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.hsnodebug/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构建库以启用调试。

最新更新