Forum: D Programlama Dili RSS
WYSIWYG dizgilerde " karakteri
ersiner #1
Member since Aug 2010 · 10 posts · Location: Ankara, Türkiye
Group memberships: Üyeler
Show profile · Link to this post
Subject: 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
This post was edited on 2010-08-19, 18:34 by ersiner.
ersiner #2
Member since Aug 2010 · 10 posts · Location: Ankara, Türkiye
Group memberships: Üyeler
Show profile · Link to this post
Ş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
This post was edited on 2010-08-19, 18:46 by ersiner.
acehreli (Moderator) #3
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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
Member since Aug 2010 · 10 posts · Location: Ankara, Türkiye
Group memberships: Üyeler
Show profile · Link to this post
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
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please note the verification code from the picture into the text field next to it.
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Not logged in. · Lost password · Register
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Current time: 2012-02-05, 11:12:46 (UTC -08:00)