Thread overview
WYSIWYG dizgilerde " karakteri
Aug 19, 2010
ersiner
Aug 19, 2010
ersiner
Aug 19, 2010
ersiner
August 19, 2010

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 )

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 19, 2010

Ş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..

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 20, 2010

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 }

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 19, 2010

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]