Thread overview
Hazır dizgi değerlerinin türü
April 11, 2010

trileri'yi dmd 2.038'den beri derleyemiyorum. Bunun bir derleyici hatası yüzünden olduğunu düşünmüştüm ama 2.043'te de aynı olunca sordum:

http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.learn&article_id=19416

Sorun, "merhaba" şeklinde yazılan dizgi hazır değerlerinin türünde.

Benim bu güne kadar sandığım şuydu:


"merhaba"c  ->  string
"merhaba"w  -> wstring
"merhaba"d  -> dstring
"merhaba"   ->  string (yanlış biliyormuşum)

Sonuna c yazılmayan hazır değerlerin de string olduklarını sanıyordum. Yukarıdaki konuda öğrendiğime göre, türleri özellikle belirtilmeyen dizgi sabitleri, kullanımlarına göre belirleniyormuş.

Bunun bir kısmını biliyordum. Örneğin

dstring dizgi = "merhaba";

yazıldığında elimizde dstring türünden bir dizgi olduğu için onun "merhaba" ile ilklendiğini anlıyordum. Zaten başka bir şey de beklenemez...

Bilmediğim bir şey, hazır değer, C türünden bir dizgi ile ilklendiğinde, sonuna ''\0'' karakteri bile yerleştiriliyormuş:

const char * dizgi = "merhaba";    // C türü dizgi; sonunda '\0' var

Yani "merhaba", 4 farklı tür yerine geçebiliyormuş. Buraya kadar tamam.

Bir sorun, işlev yüklemede ortaya çıkıyor:

void foo(const(char)[])
{}

void foo(const(wchar)[])
{}

void foo(const(dchar)[])
{}

void main()
{
   foo("merhaba");      // <-- hangi foo?
}

"merhaba"nın türü benim yanlış bildiğim gibi string olmadığı için, derleyici hangi işlevi çağıracağını bilemiyor:

deneme.d(10137): Error: function deneme.foo called with argument types:
	((string))
matches both:
	deneme.foo(const(char)[] _param_0)
and:
	deneme.foo(const(dchar)[] _param_0)

main'deki çağrının hem char dizisi alana, hem de dchar dizisi alana uyduğunu söylüyor. (Nedense o iki türü seçiyor ve susuyor. Bunlardan birisini silince wchar'lı işleve uyduğunu da söylemeye başlıyor.)

Ara not olarak, "merhaba"nın türü tek başına sorgulandığında string seçiliyor:

writeln(typeof("merhaba").stringof);    // "string" diyor

Bu yüzden, trileri'deki Dizgi'nin opEquals işlevini istediğim gibi yükleyemiyorum; çünkü dizgi=="merhaba" yazıldığında hangi opEquals'un çağrılacağı bilinemiyor.

Ne yapmak gerek? Böyle bir kütüphane D'nin dizgilerinden hangisini desteklemeli? string daha yaygın olduğu için yalnızca string'le mi çalışmalı? Yoksa kendisi perde arkasında bir dchar dizisi kullandığı için yalnızca dstring'le mi çalışmalı?

Yukarıdaki konuda sordum. Öğreneceğim... :)

Ali

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

April 15, 2010

Alıntı:

>

Ne yapmak gerek? Böyle bir kütüphane D'nin dizgilerinden hangisini desteklemeli? string daha yaygın olduğu için yalnızca string'le mi çalışmalı? Yoksa kendisi perde arkasında bir dchar dizisi kullandığı için yalnızca dstring'le mi çalışmalı?

dkvG'de const dchar[] kullanıyor daha sonrada string türüne çevriliyor. Ama şablon ile hem const dstring,const wstring,const string ile kullanamaz mıyız ? Bu şablon ile kullanım başka bir modül şelinde de olabilir.

Bu arada trileride daha önce stringleri dstring olarak değiştirmişiz. dstring bizim için uygundur. Eğer Türkçe karakter kullanacaksak ve o karakterlere özel değişiklikler yapacaksak zaten türü dstring ya da dchar[] seçmeyi alışkanlık yapmalıyız.

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

April 15, 2010

Şöyle bir şey yapabilir miyiz :

trileri şuan kendi içinden hep dchar türü kullansın. Ama parametre olarak dchar'a çevrilebilecek değerler alsın ve trileri kendi içinde dchar'a çevirsin.

Yada direk sadece dchar kullanılsın. Nasıl phobos direk string kullanıyorsa bizde öyle yapalım. Sonuçta phobos kütüphanesi için biz zorla string'e çeviriyoruz. trileri içinde dchar'a çeviririz, çok büyük bir sorun olmaz.

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

April 15, 2010

Alıntı:

>

Sorun yok; dağılın! :-p

Esas sorun şimdi başlıyor :-) Dershanede ek yapmak gerekiyor. Ayrıca "merhaba"c şeklinde yazmayıda alışkanlık etmemiz gerekiyor.

Şimdi dağılabiliriz :-P

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

April 15, 2010

dchar[] kullanmak mantıklı bir seçim. Ama yine de kullanıcının elinde char[] olduğunda dönüşüm yapmak zorunda kalması beni hep düşündürüyor.

Evet, şablon olunca "merhaba" gibi bir hazır değer string olarak seçiliyor. O kadarı güzel... Benim asıl sorunum, trileri.'nin Dizgi'sinin opEquals işlecini yazarken oluşmuştu. Doğal olarak, böyle bir türün her tür dizgiyle kolayca çalışmasını istedim.

Ben de opEquals'u baştan şablon olarak yazmıştım. Ama öyle yapınca türün kendi opEquals(Object) işleciyle karışıyordu. O yüzden şablon yerine, Dizi için birden fazla opEquals tanımladım. Yani opEquals'u bu türler için yükledim.

Her dizgi türü için yüklediğim için de "merhaba"nın hangisine gönderileceği bilinemedi.

Şablon çözümüne tekrar bakacağım ve neden onu bıraktığımı hatırlamaya çalışacağım.

Ne olursa olsun, "merhaba" gibi bir hazır değerin kesin bir türü olmadığını aklımızda tutalım. Başka kütüphanelerle de sonuna "merhaba"c diye yazmak gerekebilir.

Ali

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

April 15, 2010

Alıntı (canalpay):

>

trileri şuan kendi içinden hep dchar türü kullansın. Ama parametre olarak dchar'a çevrilebilecek değerler alsın ve trileri kendi içinde dchar'a çevirsin.

Evet, fikir o; ve zaten öyle çalışıyor. Sorun, hazır dizgi ile çağırınca oluşuyor.

Aslında tr.Dizgi açısından bir sorun yok. Sorun, kullanıcının sonuna c yazmasının gerekmesi: "merhaba"c.

Büyük bir sorun değil aslında. Sonuçta D, C++ olmadığı için hazır değerlerin dört farklı hedefi olabiliyor.

Alıntı:

>

Yada direk sadece dchar kullanılsın. Nasıl phobos direk string kullanıyorsa bizde öyle yapalım. Sonuçta phobos kütüphanesi için biz zorla string'e çeviriyoruz. trileri içinde dchar'a çeviririz, çok büyük bir sorun olmaz.

Ona da katılıyorum. Örneğin çok standart olduğu için 'toString' desteklenmeli; ve zaten var. Amaç, olabildiğince kullanışlı yapmak...

Bu konu üzerinde düşündükçe, aslında bir sorun olmadığını görüyorum. Bunlar, benim "merhaba"nın string olduğunu sanmamdan kaynaklanıyor. Eğer değilse, kullanıcının açıkça bildirmesinde bir sakınca olmamalı. Zaten sorun yalnızca hazır değerlerde var. Türü belirtilmiş olan değişkenlerde sorun yok.

Sorun yok; dağılın! :-p

Ali

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