2010-03-30 30 views
10

Çok satırlı dize değişmezleri içeren Haskell kodunda CPP uzantısını kullanmak mümkün mü? Haskell için başka şartlı derleme teknikleri var mı? ÖrneğinHaskell'de CPP uzantısı ve çok satırlı değişmezler

, en bu kodu alalım:

[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 6.12.1 kullanarak, cpphs mevcuttur: Ben {-# LANGUAGE CPP #-} yorumsuz

-- If the next line is uncommented, the program does not compile. 
-- {-# LANGUAGE CPP #-} 

msg = "Hello\ 
    \ Wor\ 
    \ld!" 

main = putStrLn msg 

ardından GHC bir sözcük hata ile bu kodu yalanlıyor .

Ben cpphs.compat sarmalayıcı kullanarak ve -pgmP cpphs.compat seçenek yardımcı olur, ancak ben özel kabuk komut bağlı değildir bir çözüm olsun isterim onaylamak. -pgmP cpphs çalışmıyor.

P.S. GHC < 6.12 ve GHC> = 6.12 için farklı kod kullanmam gerekiyor, önişlemci olmadan mümkün mü?

UPD. Ganesh'in kabul edilen cevabına ek olarak, diğer bir geçici çözümün tüm koşullu bildirimleri {-# LANGUAGE CPP #-} ile ayrı bir modülde koymak ve böylece çok satırlı dizeleri olan modüllerde CPP'den kaçınmak olduğunu öğrendim.

+0

Neden "Hello" ++ "Wor" ++ "ld!" '? – kennytm

+0

Çünkü "Merhaba \ whitespace + \ World!" 'Haskell 98'dir. Çünkü onu kullanan bazı kodlar vardır. Çünkü "++" 'daha fazla yer kaplıyor (ve 80 sütunun ötesindeki kodu beğenmiyorum). Son olarak, projedeki her çok satırlı dizeyi yeniden sarmadan ve yeniden biçimlendirmeden bir yama yazmak istiyorum. – sastanin

cevap

6

cpphs okur ben compat komut gereksiz kılan düşünüyorum --cpp seçeneği kendisi vardır: cpphs bakınız Bu davranışı etkinleştirmek için -optP --cpp'u GHC'ye (-pgmP cpphs) iletmeniz gerektiğini düşünüyorum.

2

O GHC kullanım kılavuzu adreslerini bu görünüyor: Section 4.10.3.1 şimdi

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

Teşekkür ederim. \ N sonra firar boşlukları eklemeye çalıştım, ancak cpp sadece "boşluk ile ayrılmış satır ters eğik çizgisi ve yeni satır" uyarısını bildirir ve kod hala derlemez. GNU kullanımı cpp 4.4.3. – sastanin