Forum: Duyurular RSS
dmd 2.059 çıktı
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: dmd 2.059 çıktı
  http://dlang.org/changelog.html

Ali
zafer #2
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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
https://github.com/zafer06 - depo
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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ı?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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."

     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.

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.

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

Evet.

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.

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.

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

Ne güzel olur! ;)

Ali
Avatar
Salih Dinçer #7
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bugün bilmediğim bir şeyin farkına vardım ve tam da aşağıda alıntıladığım konu ile ilgili:
acehreli on 2013-11-03, 12:11:
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.

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

Evet.

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.

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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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?

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.

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

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

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

Doğru.

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Duyurular RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 03:57:48 (UTC -08:00)