如果将整个块放在CPP条件分支中,则可以基于标志来更改haddocks:
#if SOME_MACRO
-- | Whether SOME_MACRO is true
-- >>> someMacro
-- True
someMacro :: Bool
someMacro = macroVal
#else
-- | Whether SOME_MACRO is true
-- >>> someMacro
-- False
someMacro :: Bool
someMacro = macroVal
#endif
而且文档看起来像您期望的那样,并且
doctest
也可以按预期工作。但这是较大注释或代码块的维护噩梦。另一方面,这似乎不起作用:
-- | Whether SOME_MACRO is true
-- >>> someMacro
#if SOME_MACRO
-- True
#else
-- False
#endif
someMacro :: Bool
someMacro = macroVal
这是为什么?在Haddock之前不处理CPP吗?我的直觉是因为在CPP阶段之后换行符仍然存在,但这只是一种直觉
最佳答案
我不记得是否如您所说插入了换行符,或者-更糟的是-还插入了某些#line
指令,这会破坏Haddock块。
无论如何,我认为可以通过以下方法解决此问题:
#if SOME_MACRO
#define SOME_MACRO_HK -- True
#else
#define SOME_MACRO_HK -- False
#endif
-- | Whether SOME_MACRO is true
-- >>> someMacro
SOME_MACRO_HK
someMacro :: Bool
someMacro = macroVal
根据需要在宏中插入换行符,可能会将整个Haddock块集成到其中。一点也不优雅,但应该做到。
关于haskell - Haddock内部的CPP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39087731/