Thread overview
ÇILGINCA: Yapıdaki Şablonlar(alias)
Sep 17, 2022
Salih Dincer
Sep 17, 2022
Salih Dincer
Sep 17, 2022
Ali Çehreli
Sep 17, 2022
Salih Dincer
Sep 17, 2022
Ali Çehreli
Sep 22, 2022
Salih Dincer
September 17, 2022

Evettz (!) dudak uçuklatacak cinsten, bir Zihni Sinir Proceye hoş geldiniz :)

Aslında anlatacaklarım basit ve Ali hoca ayrıntılı bir şekilde şurada anlatmış ama içinde bir hazine yatıyor, yani alias' meğer ne biçim bir hazineymiş de (en azından ben) farkında değilmişiz...

Çıkış noktam önce Puneet Goel'in geçen hafta ayın 9'unda başlattığı ve Walter'ın 0bxxxx_xxxx'li ifadeleri D'den çıkarmak istemesine karşı yaptığı şu itiraz başlığıydı. Alevli tartışmalardan biri olan (an itibariyle 18 sayfa) başlıkta, Dave P. bir kod paylaştı:
https://forum.dlang.org/thread/vphguaninxedxopjkzdk@forum.dlang.org?page=7

(Tam olarak 7. sayfanın sonu)

Aslında konumuz dışı ama çoğunluk, benim de kısmen desteklediğim gibi bu kullanımın kalkmamasını istiyor. Walter ise 0xff_ff'li hali neyinize yetmiyor, bir yerden sonra kalemin ucuyla sayarsınız diye inat ediyor. Bakalım zaman ne gösterecek, el mi yaman bey mi 😀

Konumuza, paylaşılan kodun (parse işlevini) geliştirdiğim haliyle dönelim ve bunu şimdilik modüller arası bir bölüme kopyalayın:

auto parse(alias E)(string str)
{
  ulong result;

  foreach(c; str)
  {
    switch(c)
    {
      case E.zero:
        result <<= 1;
        break;

      case E.sign: case E.SIGN:
        result <<= 1;
        result |= 1;
        break;

      case ' ': case '\r':
      case '_': case '\n': case '\t':
        continue;

      default:
        import std.traits : EnumMembers;
        import std.format : format;
        char[] m = [EnumMembers!E];
        auto err = format("TANIMSIZ ÜYE!\nÜYELER: %s", m);
        throw new Exception(err);
    }
  }
  return result;
}

Şimdi arkadaşlar, adım adım gidelim çünkü dudaklarınız uçuklamasın :)

Şaka bir yana, lütfen siz parse() isminde ayrıştırma/çözümleme yapan ve içinde switch/case'ler ile dolu olan bir Parser'ımız olduğunu hayal edin. Yani şimdilik yukardaki gibi basit bir işlev ve yaptığı ise ASCII 0/1'ler ile ifade edilen (en fazla 64 karakter olmalı) dizgenizi (=string, bence dizgi'den daha güzel) ulong türünde sayıya çevircek. Yani bu başka bir şey de olabilirdi.

Kodu kısaca, yine alias'lar (takma adlar) ile şu şekilde test edebilirsiniz. Orijinal koda göre enum'lar olmazsa işkevimiz çalışmıyor ve doğru karakterleri kullanmazsanız sizi Türkçe uyarıyor ve hangi üyeleri kullanmanız gerektiğini listeliyor:

// import xyz.parser : parse;
import std.stdio;
void main()
{
  enum BinToChr : char {
    zero = '.',
    sign = 'x', SIGN = 'X'
  }
  alias conNumv1 = parse!BinToChr;
  conNumv1(".X.._x.x.").writeln;
  //         64 + 12 = 74

  enum BinToNum : char {
    zero = '0',
    sign = '1', SIGN = '|'
  }
  alias conNumv2 = parse!BinToNum;
  conNumv2("0|00_1010").writeln;
  //         64 + 12 = 74

  auto hata = parse!BinToChr("ha_ta");
}/* ÇIKTISI:
74
74
object.Exception@
aliasTemplateInStruct.d(32): TANIMSIZ ÜYE!
ÜYELER: .xX
----------------
??:? pure @safe ulong source.parse!(source.main().BinToChr).parse(immutable(char)[]) [0x562e10374be5]
??:? _Dmain [0x562e103746ba]
*/

Devamı gelecek inşallah >>

September 17, 2022

On Saturday, 17 September 2022 at 00:18:53 UTC, Salih Dincer wrote:

>

Devamı ... >>

Buraya kadar aslında farkında olmadan alias'ın 2 şekliyle de kullandık:

  • 1'si, işlevde kullanılmak üzere enum atamak için işlev şablonu olarak,

  • 2'si, işlevi zaten kullanmak kolay olsa da adım adım gitmek ve güzel gözüken kodlar yazmak için takma ad olarak.

Üçüncüsüne yani yapı şablonu olarak kullanmayı denemedik! Şimdiki örneği kodun hata satırından sonrasına yapıştırın ve çok çok lezettli şu olanağı görün:

  // auto hata = parse!BinToChr("ha_ta");

  struct Convert(alias E)
  {
    string str;

    auto convert(alias FN)() {
      return FN!E(str);
    }
  }

  string str = ".X.._x.x.";
  auto çevir = Convert!BinToChr(str);
  assert(çevir.convert!parse == 74);

Aslında burda da yapı şablonu ile beraber 2 alias kullanımı var: E/FN Görebiliyor musunuz, ayrıca kod/kullanım ne kadar basit değil mi?

Dudağınız uçuklamamıştır canım 😀

Sevgiler...

September 17, 2022
On 9/16/22 17:18, Salih Dincer wrote:

> Walter ise `0xff_ff`'li hali neyinize
> yetmiyor, bir yerden sonra kalemin ucuyla sayarsınız diye inat ediyor.

Galiba kalemin ucuyla saymayı 0b'nin uzun olduğundan okunaksız olduğunu iddia etmek için söyledi.

> auto parse(alias E)(string str)

Güzel: Yani, .zero ve .sign üyeleri olan her türle işliyor. (Sign önce beni biraz yanıltı çünkü eksi işareti gibi düşündüm.)

Evet, 'alias' çok yararlı. :) Ama gereği bu örnekte pek anlaşılmıyor çünkü burada 'parse(E)' diye tanımlayınca da aynı.

>          auto err = format("TANIMSIZ ÜYE!\nÜYELER: %s", m);

Hangi karakterin yanlış olduğu da yazılabilir tabii.

> dizgenizi (=string, bence dizgi'den daha güzel)

Evet, "dizge" çok güzel bir sözcük ama kelime anlamlarına bakınca "dizgi" daha doğru geliyor. En azından "dizgi"nin anlamında "harf" var. :)

Ali


September 17, 2022

On Saturday, 17 September 2022 at 12:53:53 UTC, Ali Çehreli wrote:

>

On 9/16/22 17:18, Salih Dincer wrote:

>

auto parse(alias E)(string str)

Güzel: Yani, .zero ve .sign üyeleri olan her türle işliyor. (Sign önce beni biraz yanıltı çünkü eksi işareti gibi düşündüm.)

Öneriniz ne hocam? Sonuçta minus, negative ve math ile ilgili bir uygulama değil. Ama dijital elektronikteki MSB/LSB'den yani "significant" sözcüğünden etkilendim.

On Saturday, 17 September 2022 at 12:53:53 UTC, Ali Çehreli wrote:

>

On 9/16/22 17:18, Salih Dincer wrote:

Evet, 'alias' çok yararlı. :) Ama gereği bu örnekte pek anlaşılmıyor çünkü burada 'parse(E)' diye tanımlayınca da aynı.

Bunu şimdi denedim ve evet, işlevler için çıkarsamada çok kullanıyorum. Ama görünüşe göre yeterince etkin kullanmıyormuşum! Çünkü sadece işlev parametreleri için kullanıyordum.

Ama convert(alias FN)'de işe yaramadı şu hatayı aldım:

>

Error: template instance convert!(parse) does not match template declaration convert(FN)()

Zaten dersin konusu olan alias yapı içinde şart, dolayısıyla hata normal. Bir de tabi foo(this s)() var ki şurda işledik. Eee tabi başka bir konu.

Unutmadan, struct Convert(E) de çalıştı. Bu durumda sadece 2 yerde özelliğini gösterdik. Her şeye rağmen çok güzel! Ama sanki orada zaten alias var, yani derleyici her iki şekilde de kabul ediyor ve kısa yazım şeklini kullanıyoruz gibime geldi bana?

On Saturday, 17 September 2022 at 12:53:53 UTC, Ali Çehreli wrote:

>

On 9/16/22 17:18, Salih Dincer wrote:

>
     auto err = format("TANIMSIZ ÜYE!\nÜYELER: %s", m);

Hangi karakterin yanlış olduğu da yazılabilir tabii.

Bunu düşündüm ama default bloğunu daha çok şişirmek istemedim. Sonuçta daha önemli bir sorun var: 63'den fazla sola kaydırma yapmamak için bir sayaç eklemeliyim.

On Saturday, 17 September 2022 at 12:53:53 UTC, Ali Çehreli wrote:

>

On 9/16/22 17:18, Salih Dincer wrote:

>

dizgenizi (=string, bence dizgi'den daha güzel)

Evet, "dizge" çok güzel bir sözcük ama kelime anlamlarına bakınca "dizgi" daha doğru geliyor. En azından "dizgi"nin anlamında "harf" var. :)

Türkiye'de elektronik sektöründe (Amerika'da nasıl?) şu meslek ve bölümler var:

  • Dizgi Elemanı (bazen montör deniyor)
  • Manuel Dizgi
  • SMD Dizgi
  • THT Dizgi
  • Dizgi Makinesi
  • Dizgi Robotu

Üstelik -dizgi ile -dizi arasında sadece bir harf fazlalık var. Yani yazım hatalarında yanlış anlaşılmalara müsait. İngilizce karşılıkları ise avantajlı string/array. Eee tabi teoride ikisi de dizi tabi 😀

Teşekkürler...

September 17, 2022
On 9/17/22 10:45, Salih Dincer wrote:

>> Güzel: Yani, .zero ve .sign üyeleri olan her türle işliyor. (Sign önce
>> beni biraz yanıltı çünkü eksi işareti gibi düşündüm.)
>
> Öneriniz ne hocam? Sonuçta minus, negative ve math ile ilgili bir
> uygulama değil. Ama dijital elektronikteki MSB/LSB'den yani
> "significant" sözcüğünden etkilendim.

Bilmem. :) .off/.on? .zero/.one?

Ali


September 22, 2022

On Saturday, 17 September 2022 at 19:37:51 UTC, Ali Çehreli wrote:

>

Güzel: Yani, .zero ve .sign üyeleri olan her türle işliyor.

Unit yaptım hocam! Çünkü matematikte "unity" diye bir kavram var; -bir, -birlik, -teklik, - birleşme (çarpmada etkisiz eleman) anlamına gelen ve teknik dilde "tek olma durumu" varmış. Hoş, burda Arapça'da gelen -sıfır karşısında çift olasılık (karakter) var ya x'ler birbirini götürüyor diye kötü espiri yapayım 😀

enum BinToChr : char {
     zero = '.',
     unit = 'x',
     UNIT = 'X'
} alias conNum = parse!BinToChr;

Sevgiler...