Haskell 中的 CPP 扩展和多行文字
-
23-09-2019 - |
题
是否可以在包含多行字符串文字的 Haskell 代码上使用 CPP 扩展?Haskell 还有其他条件编译技术吗?
例如,让我们看一下这段代码:
-- If the next line is uncommented, the program does not compile.
-- {-# LANGUAGE CPP #-}
msg = "Hello\
\ Wor\
\ld!"
main = putStrLn msg
如果我取消注释 {-# LANGUAGE CPP #-}
, ,然后 GHC 用词法错误反驳此代码:
[1 of 1] Compiling Main ( cpp-multiline.hs, cpp-multiline.o )
cpp-multiline.hs:4:17:
lexical error in string/character literal at character 'o'
使用 GHC 6.12.1,可以使用 cpphs。
我确认使用 cpphs.compat 包装纸和 -pgmP cpphs.compat
选项有帮助,但我想要一个不依赖于自定义 shell 脚本的解决方案。 -pgmP cpphs
不起作用。
附:我需要对 GHC < 6.12 和 GHC >= 6.12 使用不同的代码,没有预处理器可以吗?
UPD. 。除了 Ganesh 接受的答案之外,我还发现另一种解决方法是将所有条件声明放在一个单独的模块中 {-# LANGUAGE CPP #-}
从而避免在具有多行字符串的模块中出现 CPP。
解决方案
cpphs现在有一个--cpp选项本身,我认为这使得compat的脚本不必要的:看到cpphs在 1.3入门http://haskell.org/cpphs/
我想你需要传递-optP --cpp
到GHC(以及-pgmP cpphs
)来启用此行为。
其他提示
GHC 用户手册似乎解决了这个问题: 第 4.10.3.1 节 读
一句小小的警告:-cpp 对“字符串间隙”不友好..换句话说,如下所示的字符串:
strmod = "\
\ p \
\ "
不与 -cpp 一起使用;/usr/bin/cpp 省略反斜杠-换行符对。
但是,如果您在行尾添加空格,则 cpp(至少是 GNU cpp 以及可能的其他 cpp)会单独保留反斜杠-空格对,并且字符串间隙会按预期工作。
不隶属于 StackOverflow