Thread overview
dmd 2.059 çıktı
Apr 12, 2012
zafer
Apr 18, 2012
Salih Dinçer
Nov 03, 2013
Salih Dinçer
Nov 28, 2013
Salih Dinçer
April 12, 2012

Kullandığım programların yeni bir sürümü çıkınca yeni bir oyuncak bulmuş bir çocuk gibi hissediyorum. Müthiş bir keyif, heves, ve merakla onu indirmek, kurmak, denemek bambaşka bir keyif veriyor, dmd v2.059'a hücümmmmm :-D

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

April 12, 2012

http://dlang.org/changelog.html

Ali

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

April 12, 2012

UFCS çalışıyor! :D

import std.stdio;
import std.range;

struct FibonacciSerisi
{
   int baştaki = 0;
   int sonraki = 1;

   enum empty = false;

   int front() const @property
   {
       return baştaki;
   }

   void popFront()
   {
       int ikiSonraki = baştaki + sonraki;
       baştaki = sonraki;
       sonraki = ikiSonraki;
   }

   FibonacciSerisi save() const @property
   {
       return this;
   }
}

void main()
{
   writeln(take(cycle(take(FibonacciSerisi(), 5)), 20));
   FibonacciSerisi().take(5).cycle().take(20).writeln();
}

Programın son iki satırı aynı çıktıyı üretiyor:

'[0, 1, 1, 2, 3, 0, 1, 1, 2, 3, 0, 1, 1, 2, 3, 0, 1, 1, 2, 3]
[0, 1, 1, 2, 3, 0, 1, 1, 2, 3, 0, 1, 1, 2, 3, 0, 1, 1, 2, 3]
'

Bu arada, henüz .deb pakedi hazır olmadığı için .zip dosyasından yerel bir dizine kurduğum için bağlayıcı hataları aldım. Sanıyorum zaten kurulu olan 2.058'in kütüphane dosyası seçiliyordu. Onun için şimdilik phobos dosyasını açıkça belirtmem gerekti:

'~/dmd2.059/linux/bin64/dmd deneme.d ~/dmd2.059/linux/lib64/libphobos2.a -ofdeneme -property -unittest -w -wi'

Ali

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

April 18, 2012

Henüz yeni sürümü deneyecek vakit bulamadım. UFCS denilen olay bana sanki ECMA uyumluluğu arttırmış gibi geldi ama deneyeceğim...:)

Peki başka denediğiniz yenilikler var mı?

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

November 03, 2013

Merhaba Ali hocam,

Başka bir başlıkta, buradaki koda referans verdiğimde bir şey dikkatimi çekti. Aslında kodu biraz geliştirirken farkettim...:)

Bu yapı içerisine dışarıdan bir işlev yerleştirdiğimizde sorunsuz bir şekilde çalıştırıyoruz. Ama bu hala dışarıda olmaya devam etse bile, UFCS'de öncelik soldaki nesnenin içindeki oluyormuş. Dolayısıyla şu şekilde denediğimizde aslında her ikisini de kastediyoruz:

 auto tekler(FibonacciSerisi f) {
   scope(exit) f.popFront();

   char BS = 8;  //Back Space Character

   return f.front() % 2 ? format("%s", f.front) :
                          format("%s...", BS);
 }

void main()
{
    auto Fib = new FibonacciSerisi;
    /*
    foreach(f; Fib.take(10)) {
         f.write(" ");
    }//*/
    auto xSay = 10;
    while(--xSay) Fib.tekler.write(" ");/*
    while(--xSay) tekler(Fib).write(" ");//*/
}

Eğer hala iki işlev kod içinde bulunmaya devam ediyorsa (işlev yapının başında da olsa bir şey değişmiyor), sorunu düzeltmek için hemen yukarıdaki gizlediğim satırdaki gibi parantez içinde kullanmak gerekiyor. Aslında işaretçilerde veya başka durumlarda bazı UFCS sorunları yaşamıyoruz değil. Neyse ki çeşitli yerlere parantez koyarak sorun düzeliyor.

Peki bu yapının içindeki save() üyesi, tam olarak ne işe yaramaktadır? Aslında kaldığı yerden devam etmesi için düşünülmüş olsa gerek. Tabi ben bunun faydasını göremediğim için emin değilim. Ama yapıyı sınıfa çevirdiğimde kaldığı yerden devam ettiğini gördüm. Belki de başka bir amaca hizmet ediyordur.

Dip Not: Aklımda bir soru daha var ama ilgili başlıkta değineceğim...:)

Teşekkürler...

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

November 03, 2013

Alıntı (Salih Dinçer):

>

UFCS'de öncelik soldaki nesnenin içindeki oluyormuş.

Benim bildiğim de öyle: "Bu nesnenin bu isimde üyesi yoksa bir de normal işleve bak."

Alıntı:

>
>      while(--xSay) tekler(Fib).write(" ");//*/
> ```

> sorunu düzeltmek için hemen yukarıdaki gizlediğim satırdaki gibi parantez içinde kullanmak gerekiyor.

Bende o da yetmedi. Ama şu oldu:

while(--xSay) (*Fib).tekler.writeln;


Normal, çünkü Fib bir gösterge olduğu halde tekler bir nesne alıyor. * işleciyle göstergenin gösterdiği nesneye erişmek gerekiyor.

Alıntı:
> Peki bu yapının içindeki save() üyesi, tam olarak ne işe yaramaktadır?

Onu ForwardRange gerektiriyor. Bir aralığın belirli bir andaki durumunun bir kopyasını döndürür.

Alıntı:
> Aslında kaldığı yerden devam etmesi için düşünülmüş olsa gerek.

Evet.

Alıntı:
> Tabi ben bunun faydasını göremediğim için emin değilim.

cycle algoritmasını düşün: Bir aralığı alır ve sürekli olarak tekrarlar. Tekrarlayabilmesi için başlangıç durumunu saklayabilmesi gerekir. O yüzden cycle ForwardRange gerektirir.

Alıntı:
> Ama yapıyı sınıfa çevirdiğimde kaldığı yerden devam ettiğini gördüm.

save()'in asıl aralıktan bağımsız bir kopya döndürmesi gerekir. Tam olarak ne yaptığını bilmiyorum ama eğer iki sınıf değişkeni aynı asıl aralığı gösteriyor iseler dediğin gibi olur.

Alıntı:
> Aklımda bir soru daha var ama ilgili başlıkta değineceğim...:)

Ne güzel olur! ;)

Ali

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

Bugün bilmediğim bir şeyin farkına vardım ve tam da aşağıda alıntıladığım konu ile ilgili:
Alıntı (acehreli:1383509463):

>

Alıntı:

>

Peki bu yapının içindeki save() üyesi, tam olarak ne işe yaramaktadır?

Onu ForwardRange gerektiriyor. Bir aralığın belirli bir andaki durumunun bir kopyasını döndürür.

Alıntı:

>

Aslında kaldığı yerden devam etmesi için düşünülmüş olsa gerek.

Evet.

Alıntı:

>

Tabi ben bunun faydasını göremediğim için emin değilim.

cycle algoritmasını düşün: Bir aralığı alır ve sürekli olarak tekrarlar. Tekrarlayabilmesi için başlangıç durumunu saklayabilmesi gerekir. O yüzden cycle ForwardRange gerektirir.

Alıntı:

>

Ama yapıyı sınıfa çevirdiğimde kaldığı yerden devam ettiğini gördüm.

save()'in asıl aralıktan bağımsız bir kopya döndürmesi gerekir. Tam olarak ne yaptığını bilmiyorum ama eğer iki sınıf değişkeni aynı asıl aralığı gösteriyor iseler dediğin gibi olur.

Eğer 'foreach()' ile birlikte bir yapıyı (struct) kullanırsanız; örneğin bu bir yığın (stack) olabilr, standart aralık üyelerinde sırasıyla (empty, front, popFront) gezdikten sonra eski kopyayı geri yüklüyor...

Aslında bu cümle tam olarak doğru olmasa gerek. Yapının yedeğini alıp geri yüklemekten çok, son kopyası (orijinalinin kopyası) üzerinde işlem yapıp 'foreach()' kümesinden çıkıldığında bu kopyayı GC'ye emanet ediyor olmalı. Böylece yapı özgünlüğünü koruyor.

Ama tıpkı yukarıda işaret ettiğim gibi bu nesne bir sınıf (class) olursa, ana nesne (master copy) üzerinde çalışmasına devam ediyor. Dolayısıyla struct'lar yan etkisiz nesneler diyebiliriz değil mi?

Özetle bu yapıları 'foreach()' içinde kullandığınızda tıpkı başka bir değişkene eşitlediğimiz gibi kopyası alınıyor. Aynı şeyi class'lar ile yaptığımızda nesnenin kendisi değil adresi kopyalandığını hatırlayın.

Sevgiler, saygılar...

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

November 28, 2013

Alıntı (Salih Dinçer):

>

Eğer 'foreach()' ile birlikte bir yapıyı (struct) kullanırsanız; örneğin bu bir yığın (stack) olabilr, standart aralık üyelerinde sırasıyla (empty, front, popFront) gezdikten sonra eski kopyayı geri yüklüyor...

foreach nesnenin bir kopyasını kullandığı için diyebilir miyiz?

Alıntı:

>

son kopyası (orijinalinin kopyası) üzerinde işlem yapıp 'foreach()' kümesinden çıkıldığında bu kopyayı GC'ye emanet ediyor olmalı.

GC tarafı doğru değil çünkü yapı nesneleri program yığıtında yaşarlar.

Alıntı:

>

Dolayısıyla struct'lar yan etkisiz nesneler diyebiliriz değil mi?

Duruma göre değişir. Örneğin, yapının bir class üyesi olsa ve normalde yapı nesneleri o tek sınıf nesnesini paylaşırlar. Dolayısıyla, eğer o nesnede değişiklik oluyorsa o etkiyi ikisi de görürler. Tabii yapının post-blit'i varsa ve doğru şeyi yapıyorsa o başka.

Başka örnek, yapının bir dilim üyesi olsa o dilim de paylaşılır. (Aslında bu örnek aralık konusunda önemli değil çünkü tüketilen dilim her nesnenin kendi dilimidir ama genel olarak bir dilim elemanında değişiklik olsa, diğer nesne de o değişikliği görür.)

Alıntı:

>

Özetle bu yapıları 'foreach()' içinde kullandığınızda tıpkı başka bir değişkene eşitlediğimiz gibi kopyası alınıyor.

Doğru. Bir işleve parametre olarak gönderildiklerinde de öyle olur.

Alıntı:

>

Aynı şeyi class'lar ile yaptığımızda nesnenin kendisi değil adresi kopyalandığını hatırlayın.

Doğru.

Ali

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