¿Es posible utilizar la extensión CPP en el código Haskell que contiene literales de cadena multilínea? ¿Hay otras técnicas de compilación condicional para Haskell?Extensión CPP y literales multilínea en Haskell
Por ejemplo, tomemos este código:
-- If the next line is uncommented, the program does not compile.
-- {-# LANGUAGE CPP #-}
msg = "Hello\
\ Wor\
\ld!"
main = putStrLn msg
Si Descomentar {-# LANGUAGE CPP #-}
, a continuación, GHC refuta este código con un error de léxico:
[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'
Usando GHC 6.12.1, cpphs está disponible .
Confirmo que usar la envoltura cpphs.compat y la opción -pgmP cpphs.compat
ayuda, pero me gustaría tener una solución que no dependa de scripts de shell personalizados. -pgmP cpphs
no funciona.
P.S. Necesito usar un código diferente para GHC < 6.12 y GHC> = 6.12, ¿es posible sin preprocesador?
UPD. Además de la respuesta aceptada de Ganesh, también encontré que otra solución alternativa es poner todas las declaraciones condicionales en un módulo separado con {-# LANGUAGE CPP #-}
y así evitar el CPP en los módulos con cadenas de línea múltiple.
¿Por qué no utilizar '" Hola "++" Wor "++" ld! "'? – kennytm
Porque '" Hello \ whitespace + \ World! "' Es Haskell 98. Porque hay algún código alrededor del cual se usa. Porque '" ++ "' ocupa más espacio (y no me gusta el código más allá de 80 columnas). Y, por último, me gustaría escribir un parche sin volver a envolver y volver a formatear cada cadena de varias líneas en el proyecto. – sastanin