Thread overview
Özelleştirilebilir Tür (yapı)
Nov 01, 2012
Salih Dinçer
Nov 01, 2012
Salih Dinçer
Nov 02, 2012
Salih Dinçer
Nov 02, 2012
Salih Dinçer
Nov 02, 2012
Salih Dinçer
Nov 03, 2012
Salih Dinçer
November 02, 2012

Merhaba,

Bu dil öyle bir dil ki yapılabilecekler; dilinin uzunluğu (nefesinin gücü) veya parmakların hızı ile sınırlı...:)

Şuradaki (http://ddili.org/forum/thread/15,2) örneklerden faydalanarak (class yerine struct kullanarak) kendi türümü oluşturdum:

/*
* özelTür.d (02.11.2012)
*/
 struct _char { // özelleştirilebilir tür
   ubyte sayı = ubyte.max;
   alias sayı this;/*<- bu aşağıdakinin eşdeğeri:
   ref ubyte _this() { return sayı; }
   alias _this this;//*/
 }

void main() {
 _char i;    assert(i == 255);
 i++;        assert(i == 0);
 i = i.init; assert(i == 255);
}

Göz doldurmasın! Aslında sadece iki satırlık bir yapı ve arzuya göre yeni nitelikler katılabilir.

Başarılar...

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

November 02, 2012
 union _int { // BONUS
   int s;     // signed
   uint u;    // unsigned
 }
 _int un_signed;
      un_signed.s = -1;  // 0xfffffff
      un_signed.u = 1;   // 0x1

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

November 02, 2012

Az önce biraz daha geliştireyim dedim ama eldeli bölümü beceremedim. Sanırım ''alias 'sayı' this'' satırı' opOpAssing()''i bastırıyor olmalı; bir çözümü olabilir mi?

/*
* özelTür.d (02.11.2012)
*/
 struct özelTür(T) { // özelleştirilebilir tür
   T sayı = T.max; // eğer this() ile kurulmaz ise...
   T elde;
   alias sayı this;

   this(T sayı = T.max) {
     this.sayı = sayı;
   }

   @property void init() {
     sayı = T.max;
   }
   @property T change(ref T set) {
     auto _set = set;
     set = sayı;
     sayı = _set;
     return sayı;
   }
   @property void opOpAssign(string işleç)(in T bölen) const
       if (işleç == "/")
   {
       elde = sayı%bölen;
       sayı /= bölen;
       "burdaydım".writeln;
   }
 }

 alias ubyte test;
 import std.stdio;

void main() {
 özelTür!test i;  assert(i == test.max);
 i++;             assert(i == 0);
 i.init;          assert(i == test.max);

 i.writeln("<-- bu i");
 test s = 155;
 i.change(s).writeln("<-- bu s"); // aslında s'yi gösterir!
 i.writeln("<>", s);
 i /= 2;
 i.writeln("/2'den kalan = ", i.elde);
}

Çıktısı:
'255<-- bu i
155<-- bu s
155<>255
77/2'den kalan = 0
'

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

November 02, 2012

Merhaba,

Başka bir makineye geçmeme rağmen (bu sefer 32 bit) ben de ne hikmetse o şekilde çalışmıyor. Ama şunda sorun olmadı:

 i /= cast(ubyte)2;
 i.writeln(" * 2 + ", i.elde);

Bu arada const'u sonradan farklı bir şey denemek adına eklemiştim, kalmış. Kodu düzenlemeden naklettiğim için kusura bakmayın.

Başarılar...

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

November 02, 2012

Halen 2.059 kullanıyorum ve herhalde bazı farklılıkların sebebi bundan dolayı olmalı. Ancak toString() işlevini şu satır ile by-Pass ediyorum:

alias sayı this;

Zaten bu daha önce kullanılmış bende oradan kopya ettim...:)

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

November 02, 2012

O program sende derleniyor mu? dmd haklı olarak reddediyor:

       elde = sayı%bölen;

Yukarıdaki satır 'const' bir işlevin içinde olduğu için nesnenin elde üyesini değiştiremezsin:

'Error: can only initialize const member elde inside constructor
Error: cannot modify const/immutable/inout expression this.sayı
Error: template instance deneme.özelTür!(ubyte).özelTür.opOpAssign!("/") error instantiating'

Zaten opOpAssign'ın const bir işlev olması doğru olmadığından onu kaldırarak derleyeyim...

Mesajlarında yanıltıcı bilgiler var. Örneğin "77/2'den kalan = 0" yazdırıyorsun ama yanlış. Aslında sen 155'i bölmüştün. Ben şöyle denedim:

void main() {
 özelTür!test i;
 test s = 155;
 i.change(s);
 writeln(i);
 i /= 2;
 writeln(i);
}

Beklediğim sonucu aldım:

'özelTür!(ubyte)(155, 0)
burdaydım
özelTür!(ubyte)(77, 1)
'
Ali

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

November 02, 2012

Hangi derleyiciyi kullanıyorsun? Eğer toString() tanımlamadıysan özelTür nesnelerinin 255, 155, vs. diye yazılmaları da şaşırtıcı. dmd 2.060 çıktısı yukarıda da gösterdiğim gibi, türün ismini içeriyor. (?)

Ali

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

November 02, 2012

İlginç. 2.060 'sayı'yı toString() için hiç dikkate almıyor. Almasın da zaten. Çünkü yakında birden fazla 'alias this' desteklendiğinde hangisinin kullanılacağı bilinemezdi. Tahmin ettim tabii; bu konu gözümden kaçmış.

Ali

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

November 03, 2012

İlginç bir mevzuya daha girdik...:)

Birden fazla alias olayına içİçeDizi sınıfında ihtiyaç duymuştum. Anladığım kadarıyla bu desteklenecek öyle mi?

Bunun desteklediği sürümlere bakmak için şu an Windows yüklü bir yere geçtim ve oradan yazıyorum. Geriye doğru test sonuçlarımı aşağıya nakledeceğim. Herhalde tüm sürümlerde çalışsa gerek. Yani 2.060 ile alakalı bir özellik olmadığını zannediyorum. Çünkü ben de bu forumdaki bir kaç sene (2009, Temmuz'u) önceki tartışmadan kopya çekmiştim...

Denediğim kod ilk verdiğim ve sadece iki satır ekledim; yapının elemanını ekrana yansıtmak için:

/*
* özelTür.d (02.11.2012)
*/
 struct _char { // özelleştirilebilir tür
   ubyte sayı = ubyte.max;
   alias sayı this;/*<- bu aşağıdakinin eşdeğeri:
   ref ubyte _this() { return sayı; }
   alias _this this;//*/
 }

 import std.stdio;

void main() {
 _char i;    assert(i == 255);
 i++;        assert(i == 0);
 i = i.init; assert(i == 255);

 i.writeln;
}

Alıntı:

>

2.060: 255
2.059: 255
2.058: C:\DMD\deneme.d(17): Error: no property 'writeln' for type 'ubyte'
2.057: C:\DMD\deneme.d(17): Error: no property 'writeln' for type 'ubyte'
...
2.053: C:\DMD\deneme.d(17): Error: no property 'writeln' for type 'ubyte'
'daha da denemeye gerek yok sanırm...':)

Görünüşe göre bu son iki sürümde gelen bir özellik. Peki nasıl olurda iki sene önce söz ediliyordu? Belki de yapılar da desteklemiyordu. Çünkü benim kopya çektiğim sayfa sınıflardaydı...:D

Sevgiler, saygılar...

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

November 03, 2012

Alıntı (Salih Dinçer):

>

Birden fazla alias olayına içİçeDizi sınıfında ihtiyaç duymuştum.

Yani nesneler hem T, hem T[], hem de T[][] yerine geçebilecekler. Örneğin, T[] alan bir işleve gönderdin diyelim, o zaman T[] yerine geçen 'alias this' devreye girecek.

Tamam ama ya o nesne içinde T[] değil de T varsa? O zaman o nesneyi o işleve göndermemelisin yoksa yanlış olur. Demek ki nesneni asıl hangi türden olduğunu işlevi çağırmadan bilmek zorundasın.

Ali

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