È possibile utilizzare l'estensione CPP sul codice Haskell che contiene stringhe di stringa multiple? Esistono altre tecniche di compilazione condizionale per Haskell?Estensione CPP e letterali multilinea in Haskell
Per esempio, prendiamo questo codice:
-- If the next line is uncommented, the program does not compile.
-- {-# LANGUAGE CPP #-}
msg = "Hello\
\ Wor\
\ld!"
main = putStrLn msg
Se io rimuovere il commento {-# LANGUAGE CPP #-}
, quindi GHC confuta questo codice con un errore lessicale:
[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'
Utilizzando GHC 6.12.1, cpphs è disponibile .
Confermo che l'utilizzo del wrapper cpphs.compat e dell'opzione -pgmP cpphs.compat
aiuta, ma mi piacerebbe avere una soluzione che non dipenda dagli script di shell personalizzati. -pgmP cpphs
non funziona.
P.S. Devo usare un codice diverso per GHC < 6.12 e GHC> = 6.12, è possibile senza il preprocessore?
UPD. Oltre alla risposta accettata di Ganesh, ho anche scoperto che un'altra soluzione consiste nel mettere tutte le dichiarazioni condizionali in un modulo separato con {-# LANGUAGE CPP #-}
e quindi evitare CPP nei moduli con stringhe multilinea.
Perché non usare '" Hello "++" Wor "++" ld! "'? – kennytm
Perché '" Hello \ whitespace + \ World! "' È Haskell 98. Perché c'è del codice attorno al quale lo usa. Perché '" ++ ++ 'richiede più spazio (e non mi piace il codice oltre 80 colonne). Infine, mi piacerebbe scrivere una patch senza re-wrapping e riformattando ogni stringa multilinea nel progetto. – sastanin