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役立つことは確認していますが、カスタム シェル スクリプトに依存しないソリューションが必要です。-pgmP cpphs動作しません。

PS GHC < 6.12 と GHC >= 6.12 では異なるコードを使用する必要があります。プリプロセッサなしで可能ですか?

UPD。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 およびおそらく他の cpps) はバックスラッシュとスペースのペアをそのままにして、文字列のギャップが期待どおりに機能するようです。

于 2010-03-31T00:53:51.887 に答える