是否可以在包含多行字符串文字的 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
不起作用。
PS 我需要为 GHC < 6.12 和 GHC >= 6.12 使用不同的代码,没有预处理器可以吗?
升级版。除了 Ganesh 接受的答案之外,我还发现另一种解决方法是将所有条件声明放在一个单独的模块中{-# LANGUAGE CPP #-}
,从而避免在具有多行字符串的模块中使用 CPP。