Ist es möglich, CPP-Erweiterung für Haskell-Code verwenden, die mehrzeilige String-Literale enthält? Gibt es andere bedingte Kompilierungstechniken für Haskell?CPP-Erweiterung und mehrzeilige Literale in Haskell
Zum Beispiel, lassen Sie uns diesen Code nehmen:
-- If the next line is uncommented, the program does not compile.
-- {-# LANGUAGE CPP #-}
msg = "Hello\
\ Wor\
\ld!"
main = putStrLn msg
Wenn ich {-# LANGUAGE CPP #-}
Kommentar-, dann entkräftet GHC diesen Code mit einem lexikalischen Fehler:
[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 Mit 6.12.1, cpphs ist verfügbar .
Ich bestätige, dass die Verwendung cpphs.compat Wrapper und -pgmP cpphs.compat
Option hilft, aber ich möchte eine Lösung haben, die nicht auf benutzerdefinierte Shell-Skripts abhängt. -pgmP cpphs
funktioniert nicht.
P.S. Ich brauche einen anderen Code für GHC < 6.12 und GHC> = 6.12, ist das ohne Präprozessor möglich?
UPD. Zusätzlich zu der angenommenen Antwort von Ganesh, fand ich auch eine andere Problemumgehung, alle bedingten Deklarationen in einem separaten Modul mit {-# LANGUAGE CPP #-}
zu setzen und CPP in den Modulen mit mehrzeiligen Zeichenfolgen so zu vermeiden.
Warum nicht "Hallo" ++ "Wor" ++ "ld!" '? – kennytm
Weil '" Hello \ whitespace + \ World! "' Ist Haskell 98. Weil es irgendeinen Code gibt, der es benutzt. Weil '" ++ "' mehr Platz benötigt (und ich Code über 80 Spalten nicht mag). Und schließlich möchte ich einen Patch schreiben, ohne jede mehrzeilige Zeichenfolge im Projekt neu zu umbrechen und neu zu formatieren. – sastanin