Haskell中的CPP扩展和多行文字

时间:2010-03-30 22:26:40

标签: haskell preprocessor conditional-compilation ghc

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

P.S。我需要为GHC使用不同的代码< 6.12和GHC> = 6.12,没有预处理器是否可能?

UPD 即可。除了Ganesh接受的答案之外,我还发现另一种解决方法是将所有条件声明放在一个带有{-# LANGUAGE CPP #-}的单独模块中,从而避免使用多行字符串的模块中的CPP。

2 个答案:

答案 0 :(得分:6)

cpphs现在有一个--cpp选项本身,我认为不需要compat脚本:参见http://haskell.org/cpphs/的cpphs 1.3条目

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

答案 1 :(得分:2)

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

  

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

strmod = "\
\ p \
\ "
  

不能使用-cpp; / usr / bin / cpp删除了反斜杠 - 换行符对。

     

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