Расширение CPP и многострочные литералы в Haskell - PullRequest
10 голосов
/ 31 марта 2010

Можно ли использовать расширение 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 в модулях с многострочными строками.

Ответы [ 2 ]

6 голосов
/ 31 марта 2010

cpphs теперь имеет сам параметр --cpp, что, я думаю, делает скрипт compat ненужным: см. Запись cpphs 1.3 в http://haskell.org/cpphs/

Я думаю, вам нужно передать -optP --cpp в GHC (а также -pgmP cpphs), чтобы включить это поведение.

2 голосов
/ 31 марта 2010

Кажется, что руководство пользователя GHC решает эту проблему: Раздел 4.10.3.1 читает

Небольшое предупреждающее слово: -cpp не дружит с «пробелами». Другими словами, такими строками, как:

strmod = "\
\ p \
\ "

не работает с -cpp; / usr / bin / cpp исключает пары обратной косой черты и новой строки.

Однако, похоже, что если вы добавите пробел в конце строки, то cpp (по крайней мере, GNU cpp и, возможно, другие cpps) оставит пары обратного слеша-пробела в одиночку, и разрыв строки будет работать, как и ожидалось.

...