Можно ли использовать расширение CPP для кода на Haskell, который содержит многострочные строковые литералы? Существуют ли другие методы условной компиляции для 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 wrapper и опции -pgmP cpphs.compat
помогает, но я бы хотел найти решение, которое не зависит от пользовательских сценариев оболочки. -pgmP cpphs
не работает.
P.S. Мне нужно использовать другой код для GHC <6.12 и GHC> = 6.12, возможно ли это без препроцессора?
UPD . В дополнение к общепринятому ответу Ганеша я также обнаружил, что еще один обходной путь - поместить все условные объявления в отдельный модуль с {-# LANGUAGE CPP #-}
и, таким образом, избежать CPP в модулях с многострочными строками.