Forum: D Programlama Dili RSS
WYSIWYG dizgilerde " karakteri
ersiner #1
Üye Ağu 2010 tarihinden beri · 12 mesaj · Konum: Ankara, Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: WYSIWYG dizgilerde " karakteri
Andrei Alexandrescu, TDPL kitabında şöyle diyor: "... This implies that you cannot represent, say, the double quote character itself within a double-quoted WYSIWYG string. ..."

Yani " karaterini WYSIWYG türü bir dizgide doğrudan kullanamayız.

Bahsettiği dizgilere örnek olarak da şunları veriyor: r"like this", 'like that'.

Ve diyor ki, " karakterini WYSIWYG türü bir dizgide göstermenin tek yolu şu şekilde bir kullanım olabilir:

auto a = r"String with a \ and a " '"' " inside.";

Buradaki niyeti r"String with a \ and a " ve '"' ve " inside." dizgilerini birleştirmek. Bu üç dizgiden ilk ikisi WYSIWYG türünde. Andrei, farklı dizgi türlerinin birbiri ile birleşebileceğini söylüyor (aralarında boşluk olduğunda, yani juxtaposition durumunda).

Gel gelelim, bu örnek dmd 2.048 ile çalışmıyor (ya da ben birşeyi atlıyorum):
  import std.stdio;
  
  void main() {
      auto a = r"ersin \" '"' " er";
      writeln(a);
  }

Derleme çıktısı:
escape.d(4): semicolon expected following auto declaration, not '34U'
escape.d(4): found '" er"' when expecting ';' following statement

Neden acaba?

(Bu arada WYSIWYG nedir diyenler için: http://tr.wikipedia.org/wiki/WYSIWYG )
-- Ersin
Bu mesaj ersiner tarafından değiştirildi; zaman: 2010-08-19, 18:34.
ersiner #2
Üye Ağu 2010 tarihinden beri · 12 mesaj · Konum: Ankara, Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Şimdi tekrar denedim ve şu şekilde çalışıyor:
import std.stdio;
 
void main() {
    auto a = r"ersin \" ~ '"' ~ " er";
    writeln(a);
}
Çıktı şöyle:

ersin \" er

Boşluk yerine ~ iş görüyor gibi..
-- Ersin
Bu mesaj ersiner tarafından değiştirildi; zaman: 2010-08-19, 18:46.
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bence kitaptaki kod hatalı. Çünkü yan yana yazılmış olan dizgilerin birleştirildiklerini bilirim ama dizgilerle karakterlerin yan yana yazılarak birleştirildiklerinin doğru olduğunu sanmıyorum.

Şu bile hata veriyor:

    auto a = "ab" 'c';

Ama şu çalışıyor:

    auto a = "ab" "c";

Senin örneğini arada dizgi kullanacak şekilde şöyle de çalıştırabiliriz:

    auto a = r"ersin \" "\"" " er"; 

Tabii ortadaki dizgide \" yazmak zorunda kaldım.

Ek olarak, ters tırnak işareti de kullanılabilir:

    auto a = `ersin \" er`;

Söylediğin gibi ~ işleci de işe yarıyor ve üstelik dizgiyle karakterin birleştirilmesine de olanak veriyor. Ama burada ufak ama anlamsal bir fark var:

- dizgilerin yan yana yazılmaları, C'den beri bildiğimiz bir derleyici olanağı; sanki tek dizgi gibi yazılmış gibi derleniyor

- ~ işleci ise aslında dizgi birleştirme işlemini uyguluyor; burada ilginç olan, D'nin CTFE olanağı devreye giriyor ve o işlem derleme zamanında hallediliyor.

Sonuçta ikisinin etkisi aynı tabii.

Farkı görmek için parçalardan birisinin bir işlev tarafından oluşturulduğunu düşünelim:

string bir_dizgi()
{
    return "dünya";
}

Bu doğal olarak bir derleme hatası:

    auto a = "merhaba " bir_dizgi();

Yine doğal olarak bu çalışıyor:

    auto a = "merhaba " ~ bir_dizgi();

İşte işin güzeli, ~ kullanan da derleme zamanında hesaplanıyor.

Ali
ersiner #4
Üye Ağu 2010 tarihinden beri · 12 mesaj · Konum: Ankara, Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ben yanılmış görünüyorum (gecenin üçünde böyle oluyor herhalde :) ). Adam ısrarla `backquote` diyormuş. Dolayısı ile şu çalışıyor:

  1 import std.stdio;
  2 
  3 void main() {
  4     auto a = r"ersin \" `"` " er";
  5     writeln(a);
  6 }
-- Ersin
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-23, 23:29:43 (UTC -08:00)