2010-03-30 12 views
10

¿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.

+0

¿Por qué no utilizar '" Hola "++" Wor "++" ld! "'? – kennytm

+0

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

Respuesta

6

cpphs tiene ahora una opción --cpp sí, que creo que hace innecesario el guión compat: véase las cpphs 1.3 entrada en http://haskell.org/cpphs/

Creo que necesitaría pasar -optP --cpp a GHC (así como -pgmP cpphs) para habilitar este comportamiento.

2

Parece que las direcciones de GHC manual del usuario Este: Section 4.10.3.1 lee

A small word of warning: -cpp is not friendly to “string gaps”.. In other words, strings such as the following:

strmod = "\ 
\ p \ 
\ " 

don't work with -cpp; /usr/bin/cpp elides the backslash-newline pairs.

However, it appears that if you add a space at the end of the line, then cpp (at least GNU cpp and possibly other cpps) leaves the backslash-space pairs alone and the string gap works as expected.

+0

Gracias. Traté de agregar espacios finales después de \, pero cpp solo informa una advertencia 'barra invertida y línea nueva separadas por espacio', y el código aún no se compila. Usando GNU cpp 4.4.3. – sastanin