2010-03-30 14 views
10

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.

+0

Warum nicht "Hallo" ++ "Wor" ++ "ld!" '? – kennytm

+0

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

Antwort

6

cpphs hat jetzt eine --cpp Option selbst, was ich denke, das compat Skript überflüssig macht: siehe die cpphs 1.3 Eintrag unter http://haskell.org/cpphs/

Ich denke, Sie müssten -optP --cpp an GHC übergeben (sowie -pgmP cpphs), um dieses Verhalten zu aktivieren.

2

Es scheint, die GHC Bedienungsanleitung Adressen dieses: Section 4.10.3.1 liest

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

Danke. Ich habe versucht, nach \ Zeichenfolgen Leerzeichen hinzuzufügen, aber cpp meldet nur eine Warnung "Backslash und Newline getrennt durch Leerzeichen", und der Code kompiliert immer noch nicht. Mit GNU cpp 4.4.3. – sastanin