複数行の文字列リテラルを含む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
役立つことは確認していますが、カスタム シェル スクリプトに依存しないソリューションが必要です。-pgmP cpphs
動作しません。
PS GHC < 6.12 と GHC >= 6.12 では異なるコードを使用する必要があります。プリプロセッサなしで可能ですか?
UPD。Ganesh の受け入れられた回答に加えて、別の回避策として、すべての条件宣言を別{-# LANGUAGE CPP #-}
のモジュールに配置し、複数行の文字列を含むモジュールで CPP を回避することも発見しました。