Haskell 黑线鳕中的CPP
如果我将整个块放在CPP条件分支中,我可以基于标志更改Haddock:Haskell 黑线鳕中的CPP,haskell,c-preprocessor,haddock,Haskell,C Preprocessor,Haddock,如果我将整个块放在CPP条件分支中,我可以基于标志更改Haddock: #if SOME_MACRO -- | Whether SOME_MACRO is true -- >>> someMacro -- True someMacro :: Bool someMacro = macroVal #else -- | Whether SOME_MACRO is true -- >>> someMacro -- False someMacro :: Bool som
#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
为什么呢?CPP不是在Haddock之前处理的吗?我有一种直觉,那是因为在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块。虽然不算优雅,但应该可以。谢谢。我将尝试使用它的一个变体,它定义了一个CPP函数,该函数接受args,每个GHC版本使用一个字符串,因为这样看起来更好。我会回来报到的!