Thread overview
Ali Hoca 'dan (lvalue) üzerine nefis bir örnek...
Mar 04, 2023
Salih Dincer
Mar 04, 2023
Salih Dincer
Mar 05, 2023
Salih Dincer
Mar 12, 2023
Ali Çehreli
Apr 03, 2023
Salih Dincer
Apr 03, 2023
Ali Çehreli
Apr 04, 2023
Salih Dincer
March 04, 2023

Merhaba,

Türkçe değerlendirmeyi kod içinde açıkladım ve orijinali azıcık değiştirdim. Bu bir derlenen ve hatasız çalışıp sonlanan koddur. Yani ne görüyorsanız o :)

Eğer referans döndüren ilkEleman() işlevinin başına sadece auto konursa ya da ref başına // işaretini koyun (toggle comments) son satır hata verecektir.

/* Referans türü olmayan bir S yapımız var ve içinde i
 * Bir de içeriğini bir arttıran inc() işlevi var
 * Bu yapı, dizinin ilk elemanına 1 değeri ile kurulur
 * Sonra ilk elemanı yani yapının referansını front() ile
 * döndürüp kendi olanağı ile bir arttırılır...

 * Daha sonra, 2. bölümde benzer işlem yerel bir değişken
 * üzerinden yapılır ve bir arttırılır...
 * Umulur ki referansı olsun ama içerği 3'e yükselmesine
 * rağmen aynı nesne değildir

 * Bunu sondaki 3. bölümde görüyoruz ve derlemeye gerek
 * olmadan (çünkü kod hatasız çalışır) anlıyoruz..
 */

struct S {
    int i;

    void inc() {
        ++i;
    }
}

alias front = ilkEleman;

ref R/*
auto//*/
    ilkEleman(R)(R[] arr) {
        return arr[0];
}

void main() {
    auto arr = [ S(1) ];

    // Tamam, bu işlem arr[0] arttırır (¹)
    arr.front.inc();
    assert(arr[0].i == 2);

    // Bu, yerel değişkeni arttırır    (²)
    auto umulurkiRef = arr.front;
    umulurkiRef.inc();
    assert(umulurkiRef.i == 3);

    // Ama, dizinin içeriği hala 2!    (³)
    assert(arr[0].i == 2);
}

Haa, hazır auto yapmışken dizi içindeki S(1)'i new işleçini kullanın. Böylece lvalue haline dönecek. Sakın yıldız kullanmayın, zaten D sizin için çevirecek ama sondaki assert() satırı yine hata verecek. Muhtemelen class ile de aynı olacaktır.

Konu şuradan refere: https://forum.dlang.org/post/tttd9u$1mhn$1@digitalmars.com

Kolay gelsin...

March 04, 2023

On Saturday, 4 March 2023 at 06:51:02 UTC, Salih Dincer wrote:

>

Eğer referans döndüren ilkEleman() işlevinin başına sadece auto konursa ya da ref başına // işaretini koyun (toggle comments) son satır hata verecektir.

auto front() olayını düzeltmeliyim: Tüm assert satırları hata verecektir...

Yani herhangi bir dizi (R[]) alan front(), ilk elemanın kopyasını verecektir. İşin içine şu benzer örnekteki gibi class'lar girdiğinde de sahada bir işlev top koşturur; çünkü referans türüdür:

class Foo
{
  int i;
  this(int i) { this.i = i; }
  void inc() { ++i; }
}

auto front(R)(R[] arr) { return arr[0]; }

void main()
{
  auto arr = [ new Foo(1) ];
  arr.front.inc();

  assert(arr[0].i == 2); // beklendiği gibi 1 fazlası

  auto aynısı = arr.front;
  aynısı.inc(); // aslında aynı nesne arttırılmakta

  assert(aynısı.i == 3); // 1. kanıt
  assert(arr[0].i == 3); // 2. kanıt
}

Başarılar...

March 05, 2023

On Saturday, 4 March 2023 at 11:06:37 UTC, Salih Dincer wrote:

>

çünkü referans türüdür:

Bir de konuyla ilgili çok ünlü olan ve bir o kadar da basit başka bir örnek var. Ama dikkat, bu sefer üye değişken yönlendiriliyor ve tabi test() işlevinin içinde oluşturulan S s yok edildiğinde 42 tarih oluyor:

struct S { int a; }

ref int test()
{
    S s;
    s.a = 42;
    return s.a;
}

void main()
{
  auto p = &test();     // yerel değişkene referans
  assert(test() == 42); // iddia -O ile başarısız olur
}

Shin Fujishiro, 2010-05-24 23:21:52 UTC'de bildirmiş!

Yazar, özellikle de bunun -0 ile derlendiğinde kesinlikle başarısız olacağını savunuyor ki bu küçük escaping reference hatalarını artık derleyici yakalıyor ve programcıyı derleme bitmeden uyarıyor...

Dahası, birkaç gün önce yayınlanan ve bazılarının saçma bulduğu (sanırım DIP25 ile ilgili) işleve gelen ref parametreyi, return ref ile işaretlemek öneriliyor. İlk olarak 2010 yılında bildirilen bu konuya, daha sonra 2014'de Andrei Alexandrescu da 2 örnek (diğeri diziler ile ilgili olan) ile katkı sağlamış:

https://issues.dlang.org/show_bug.cgi?id=13902

Sonra GitHub'da DIP25 ve 69'un yardımcı olabileceğinden bahsetmiş:

>

Awesome, this should help DIP25 and DIP69.

Tabi Andrei'den uzun zamandır ses yok tabi! Sanki akademisyen olarak bu camiayı kendi bilimsel kimliğine zarar olarak gördü ve yolları ayırdı. Yoksa adam öldü mü ne? Adeta ölü gibi, açıkcası D kitabı yazmış birinden 8 yıldır haber alamamak üzücü!

Başarılar...

March 12, 2023
On 3/4/23 21:06, Salih Dincer wrote:

> Sanki akademisyen olarak bu
> camiayı kendi bilimsel kimliğine zarar olarak gördü ve yolları ayırdı.

Ailesinde ortaya çıkan sağlık sorunları nedeniyle D'nin hakettiği ilgiyi veremeyeceğini söylemişti. Sanki şu konuşma sırasında açıklamıştı diye hatırlıyorum ama şimdi tam yerini bulamıyorum:

  https://www.youtube.com/watch?v=OsOfTVm2ExY

> Yoksa adam öldü mü ne?

Eskisi kadar sık olmasa da Andrei Foundation toplantılarına hâlâ katılıyor (zaten üç kurucu üyesinden birisi).

> 8 yıldır haber alamamak üzücü!

Video'da görüldüğü gibi, yavaşlayacağını 2019'da açıklamış.

Ali

April 03, 2023

On Sunday, 5 March 2023 at 05:06:36 UTC, Salih Dincer wrote:

>

Dahası, birkaç gün önce yayınlanan ve bazılarının saçma bulduğu (sanırım DIP25 ile ilgili) işleve gelen ref parametreyi, return ref ile işaretlemek öneriliyor. İlk olarak 2010 yılında bildirilen bu konuya, daha sonra 2014'de Andrei Alexandrescu da 2 örnek (diğeri diziler ile ilgili olan) ile katkı sağlamış:

https://issues.dlang.org/show_bug.cgi?id=13902

Sonra GitHub'da DIP25 ve 69'un yardımcı olabileceğinden bahsetmiş:

>

Awesome, this should help DIP25 and DIP69.

Artık v2.103.0 ile DIP25 varsayılan! Bize nasıl bir serbestlik verecek merak ediyorum. Şurada örnekler varmış:

https://wiki.dlang.org/DIP25

Bu konuda konuşmak isteyen var mı?

April 03, 2023
On 4/3/23 10:23, Salih Dincer wrote:

> Artık v2.103.0 ile DIP25 varsayılan! Bize nasıl bir serbestlik verecek
> merak ediyorum. Şurada örnekler varmış:
>
> https://wiki.dlang.org/DIP25

Parametrenin 'return' olmasının şurada açıklıyorum:


http://ddili.org/ders/d/islev_parametreleri.html#ix_islev_parametreleri.return,%20parametre

Ama oradai ilk kodda bir hata buldum: İlk kodda "derleme hatası" yazmışım ama olmaması gerekir. (Zaten çıktıyı filan gösteriyorum; kod derlenir ve çalışır.)

'return' parametre dışında DIP25'in güvenlik getirdiğinden başka bilgim yok. Varsayılan olması güzel. :)

Ali

April 04, 2023
On Monday, 3 April 2023 at 21:06:38 UTC, Ali Çehreli wrote:
> İlk kodda "derleme hatası" yazmışım ama olmaması gerekir.

Klasik benzer şeyleri kopyala&yapıştır sorunu olsa gerek. Çünkü 2. kodda da benzer bir durum var. Ama asıl ayıp bizimdir çünkü biz bunları çoktaaann okuyup geribildirimde bulunmamız icap eder :)

Bakalım yeni sürümde ne tür geribildirimler olacak. Nisan ayı hareketli geçeceğe benziyor!

Sevgiler, saygılar...