CPP扩展和Haskell中的多行文字

是否可以在包含多行字符串的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使用不同的代码,是否有可能没有预处理器?

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


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

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


看来GHC用户手册解决了这个问题:第4.10.3.1节的内容

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

strmod = "
 p 
 "

不要使用-cpp; / usr / bin / cpp会使反斜杠 - 新行对消失。

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

链接地址: http://www.djcxy.com/p/33163.html

上一篇: CPP extension and multiline literals in Haskell

下一篇: What is the difference between . (dot) and $ (dollar sign)?