如果将整个块放在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/

10-10 03:00