12

是否可以在包含多行字符串文字的 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。

4

2 回答 2

6

cpphs 现在有一个 --cpp 选项本身,我认为这使得 compat 脚本变得不必要:请参阅http://haskell.org/cpphs/上的 cpphs 1.3 条目

我认为您需要传递-optP --cpp给 GHC(以及-pgmP cpphs)才能启用此行为。

于 2010-03-31T09:27:50.643 回答
2

GHC 用户手册似乎解决了这个问题:第 4.10.3.1 节读取

一个小小的警告:-cpp 对“字符串间隙”不友好。换句话说,字符串如下:

strmod = "\
\ p \
\ "

不要使用-cpp;/usr/bin/cpp 省略了反斜杠换行符对。

但是,如果您在行尾添加一个空格,那么 cpp(至少 GNU cpp 和可能的其他 cpp)会单独留下反斜杠空格对,并且字符串间隙按预期工作。

于 2010-03-31T00:53:51.887 回答