Thread overview
GBS-1: in/out ile İstiklâl Marşımız
January 09

Merhaba,

Bugün yaptığımız Zoom toplantısında, işlev parametrelerinden in/out işlendi. Bunlar ref'in güvensiz olduğu durumlarda hayat kurtarıcı olabiliyor! Lütfen kod içindeki ref yerine out yazıp derleyin ve farkı görün...

Aşağıdaki örneğimiz bir GBS*, yani çöp! Çöp olmayan tek şeyi ise İstiklâl Marşımız; o da 11 mısra halinde kod içinde bitişik yazılı. Güftesi, Mehmet Akif Ersoy tarafından her ne kadar Osmanlıca yazılmış olsa da bu 11 mısra 400 harften oluşuyor ve kodlamada hata yoksa eğer alfabemizin J hariç 28 harfi de tam olarak 11. mısranın "çiĞner" sözcüğü içinde yazılmış oluyor. Bu son harf: Ğ.

Bu kadar gereksiz bilgi yeter. Gerekli olan ise marşımızı oluşturan bu 10 kıtayı ezberlemek ve algoritma yazma gibi ilim ile uğraşmak; maneviyatımızı kaybetmeden!

/* in/out ile
   İstiklâl Marşımız */
import std.algorithm;
import std.range, std.stdio;

auto toplaVeSırala (    in string data,/*
ref'i out'la değişin */ref ulong[dchar] map) {
  foreach(c; stride(data, 1))
  {
    auto n = map.get(c, 0);
    map[c] = ++n;
  }
  dchar[] keys = map.keys.dup;

  return keys.sort;
}

void main() {
  ulong[dchar] map;
  string[] mısralar = [
    "korkmasönmezbuşafaklardayüzenalsancak",
    "sönmedenyurdumunüstündetütenensonocak",
    "obenimmilletiminyıldızıdırparlayacak",
    "obenimdirobenimmilletimindirancak",
    "çatmakurbanolayımçehrenieynazlıhilâl",
    "kahramanırkımabirgülnebuşiddetbucelâl",
    "sanaolmazdökülenkanlarımızsonrahelâl",
    "hakkıdırhakkatapanmilletiministiklâl",
    "benezeldenberidirhüryaşadımhüryaşarım",
    "hangiçılgınbanazincirvuracakmışşaşarım",
    "kükremişselgibiyimbendimiçiğneraşarım"
  ];

  foreach(m; mısralar)
  {
    m.toplaVeSırala(map).writeln(": ", map.length);
    sum(map.values).writeln(" adet harf eklendi!");
  }
  writefln!"Toplam %d mısra işlendi..."
  (mısralar.length);
} /* ÇIKTISI:
abcdefklmnorsuyzöüş: 19
37 adet harf eklendi!
abcdefklmnorstuyzöüş: 20
74 adet harf eklendi!
abcdefiklmnoprstuyzöüış: 23
110 adet harf eklendi!
abcdefiklmnoprstuyzöüış: 23
143 adet harf eklendi!
abcdefhiklmnoprstuyzâçöüış: 26
179 adet harf eklendi!
abcdefghiklmnoprstuyzâçöüış: 27
216 adet harf eklendi!
abcdefghiklmnoprstuyzâçöüış: 27
252 adet harf eklendi!
abcdefghiklmnoprstuyzâçöüış: 27
288 adet harf eklendi!
abcdefghiklmnoprstuyzâçöüış: 27
325 adet harf eklendi!
abcdefghiklmnoprstuvyzâçöüış: 28
363 adet harf eklendi!
abcdefghiklmnoprstuvyzâçöüğış: 29
400 adet harf eklendi!
Toplam 11 mısra işlendi...
*/

GBS: Gereksiz Bilgiler Serisi
Çok zengin bir metin olan İstiklâl Marşı'nın 11 mısrası 400 harften oluşur ve 11. mısradaki "çiğner" sözcüğü ile Türk Alfabesi'nin 28+1* harfi kullanılmış olur.(*aksanlı a: â)

May 26

On Sunday, 9 January 2022 at 20:08:22 UTC, Salih Dincer wrote:

>

Aşağıdaki örneğimiz bir GBS*, yani çöp! Çöp olmayan tek şeyi ise İstiklâl Marşımız;

Eski bir konu altından devam ettiğim için affınızı rica ederim. Çok yeni bir özelliğe (DMD v2.100.0'den itibaren) burada başlayıp muhtemelen başka bir başlıkla devam edeceğiz... 😀

Konuyu anlamak için örneğimiz aşağıda ve belki bunu bir bağlı liste ile denemek lazım. Önceki örnekte çağrışımsal dizi (associative array) kullanmıştık. Zaten altyapısında bir linked list var.

İlk soru: Bu güncellenen inout özniteliğinin parametre bölümünde kullandığımız in/out ile bir ilişkisi var mı?

@safe:

struct Node
{
    Node* next;
    int x;

    // This escapes a pointer to this struct
    // This used to be allowed because of `inout`
    @safe inout(int)* getScopePointer() inout
    {
        return &this.x;
    }

    // But what if you do not return a pointer to this struct?
    // `inout` applies because it's transitive, but `return ref` does not
    // The compiler could needlessly treat the returned pointer as a scope pointer
    @safe inout(int)* getNonScopePointer() inout
    {
        return &this.next.x;
    }

    // Corrective action for the first case:
    // if you want `inout` + `return ref`, annotate it with both
    @safe inout(int)* getScopePointer() inout return
    {
        return &this.x;
    }
}
>

The compiler would formerly add the return attribute to inout functions, under the assumption that every inout function would return its argument. However, it could also return a member of the inout argument, which would still be inout because const and immutable are transitive, while return semantics are not transitive.

Source: The inout attribute no longer implies the return attribute

May 26

On Thursday, 26 May 2022 at 08:11:32 UTC, Salih Dincer wrote:

>

Source: The inout attribute no longer implies the return attribute

Burdaki örneği denedim, fark yok sanki!

module linkedlist;

class ConList(T) {  // v2.2
  struct Node {
    T item; alias item this;
    Node * next;
    size_t counter;

    @safe inout(T)* pointer() inout return {
        return &this.item;
    }
    T* ptr() {
      counter++;
      return &item;
    }
  }

  Node * root, head;
  ConList next;
  size_t index;

//...

DEVAMI GELECEK...

May 27
On 5/26/22 01:11, Salih Dincer wrote:

> **İlk soru:** Bu güncellenen inout özniteliğinin parametre bölümünde
> kullandığımız in/out ile bir ilişkisi var mı?

in/out derken neyi kasdettiğine bağlı. :)

- inout ile ilgisi var ama

- in veya out ile ilgisi yok

>      // This escapes a pointer to this struct
>      // This used to be allowed because of `inout`
>      @safe inout(int)* getScopePointer() inout
>      {
>          return &this.x;
>      }

inout, eskiden yazılmasa bile 'return' kabul ediyormuş. Yani yukarıdaki aslında eskiden şu yazılmış gibiymiş:

/* ... */ inout return
{
  // ...
}

Bunun yanlış olduğu anlaşılmış çünkü inout olan bir üye işlev, *bu* nesne ile ilgili bir gösterge döndürmek zorunda değildir. Örneğin, aşağıdaki üye işlev bu nesnenin bir üyesinin göstergesini değil, başka bir nesnenin bir üyesinin göstergesini döndürüyor:

>      // But what if you do not return a pointer to this struct?
>      // `inout` applies because it's transitive, but `return ref` does not
>      // The compiler could needlessly treat the returned pointer as a
> scope pointer
>      @safe inout(int)* getNonScopePointer() inout
>      {
>          return &this.next.x;
>      }

Bu düzeltilmiş: 'inout' artık 'return' varsaymıyor. Gerektiğinde açıkça yazılması gerekiyor. İşte:

>      // Corrective action for the first case:
>      // if you want `inout` + `return ref`, annotate it with both
>      @safe inout(int)* getScopePointer() inout return
>      {
>          return &this.x;
>      }

Ben 'return'ü yalnızca şu bölümü yazarken araştırdığım kadar biliyorum:


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

Bu konuyla ilgisi yokmuş gibi görünse de, aslında aynı kavram çünkü yukarıdaki örneklerdeki 'return' gizli this "parametresi" ile ilgilidir.

Ali

May 29

On Saturday, 28 May 2022 at 02:18:52 UTC, Ali Çehreli wrote:

>

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

Bu konuyla ilgisi yokmuş gibi görünse de, aslında aynı kavram çünkü yukarıdaki örneklerdeki 'return' gizli this "parametresi" ile ilgilidir.

Teşekkürler hocam, bu son yazdığınızı kolaylıkla anlayabiliyorum çünkü denedim. Gerçi verdiğiniz örnek (yerel değişken içeren işlevden asıl işlevi çağırmak) dışında bir örnek henüz bulamadım ama güzel...

Özellikle yeni sürümde return şart koşulmuş. Böylece dil daha güvenli bir hale geliyor.

Sonsuz teşekkürler...