Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 黑线鳕中的CPP_Haskell_C Preprocessor_Haddock - Fatal编程技术网

Haskell 黑线鳕中的CPP

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

如果我将整个块放在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
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版本使用一个字符串,因为这样看起来更好。我会回来报到的!