Thread overview
Mixin Template
Dec 26, 2022
Salih Dincer
Dec 26, 2022
Ali Çehreli
Dec 27, 2022
Salih Dincer
Dec 28, 2022
Ali Çehreli
December 26, 2022

Merhaba,

Yapı içinde kullanılmak üzere bir takım katma şablonlar hazırlıyorum. Yanlışlıkla 2 şekilde de (özellikle v2 beni biraz şaşırtarak) kullanılabildiğini gördüm:

void main()
{
  template MyStruct(Type, Type var = 0)
  {
    MyStruct inner = var;
    struct MyStruct
    {
      Type value;

      this(Type x)
      {
        value = x + 1;
      }
    }
  }
}
  mixin MyStruct!int foo; // v1
  assert(foo.inner.value == 1);

  MyStruct!int bar = 1; // v2
  assert(bar.value == 2);

Katma gibi tasarladım ama değil gibi? Hakikaten de kısa kullanımı ile (Type'ı MyStruct yanına koyup geri kalan her şeyi kaldırarak) alıştığımız v2 sürümü ortaya çıkıyor ama hiçbir değişiklik yapmadan v1 sürümü gibi mixin ile kullandığınızda kodu bir yapı içine kurulmuş bir şekilde (hatta var: varsayılan değeriyle) ekleyebiliyorsunuz.

Belki tek eksiği içerdeki inner'ın kurucusuna derleme anında v2'deki gibi erişememeniz. Onu da pekala "var" ile halledebilirsiniz.

Muazzam esnek...

December 26, 2022
On 12/25/22 20:51, Salih Dincer wrote:

>    MyStruct!int bar = 1; // v2

O "eponymous template" kullanımı: MyStruct ismi, içindeki aynı isimdeki tanıma (struct) karşılık geliyor. Sonuçta, aşağıdaki kullanımın aynısı:

  auto bar = MyStruct!int(1);

Ali

December 27, 2022

On Monday, 26 December 2022 at 16:56:25 UTC, Ali Çehreli wrote:

>

O "eponymous template" kullanımı: MyStruct ismi, içindeki aynı isimdeki tanıma (struct) karşılık geliyor.

Hocam benim görebildiğimi görüyor musunuz?

Yani taşıyıcı şablonun ismini alması gerektiğinden bahsetmiyorum; bunu zaten kısa yazılışı ile farkında olmadan kullanıyoruz. Mesele Walter'ın şablonlar çıkmadan önceki itirazı ile alakalı. O, işlerin çığırından çıkacağını C++'daki gibi bir karmaşanın içinde boğulacağımızı savunuyordu ve sonra fikrini değiştirdi. Artık şablonlar öyle veya böyle hayatımızda...

İşin ilginci benim hayatımda bu sene girdi, öncesi meğerse farkında olmadan kullanıyormuşum ama sormam gerekiyor tekrar:

Benim görebildiğimi siz görebiliyor musunuz? Şimdi bir örnek ile birlikte devam edelim:

import std.stdio;

void main()
{
  template Range(int var)
  {
    auto empty() => value > var;
    auto front() => value;
    auto popFront() => value += 2;
  }

  template Inner(Type)
  {
    Inner inner;
    alias value = inner;

    struct Inner
    {
      Type value;
      alias value this;
    }
  }

  struct MiniIota(Type, int var)
  {
    mixin Inner!Type; // içteki yapı
    mixin Range!var;  // aralık işlevleri
  }

  MiniIota!(int, 9) foo;
  foo.value = 3;
  foo.writeln; // [3, 5, 7, 9]
}

Yani iki şablon birbirinden habersiz. İlki (
Range!var) ne value'dan haberi var ve derleyici de sorgulamıyor, ne de diğerinin (Inner!Type) kendisini bir aralık gibi kullandırılacağını biliyor.

Neticede ekmek ve kıymayı bir araya getirip şöyle doyurucu, dolgun ve lezzetli bir köfte yoğuruyor(kodluyor)sunuz :)

Ve bu sadece bir başlangıç, tekrarlı yazılan kodlar birbirleri ile uyumlu hale getirildikçe mixin'ler ile dolu bir kütüphane mümkün.

Ve evet, uzun bir derleme süre belki ama Walter onu da düşünmüş...

SDB@79

December 28, 2022
On 12/26/22 19:20, Salih Dincer wrote:

> ne `value`'dan haberi var ve derleyici de sorgulamıyor

Şablonların dilin yazım kurallarına uymaları gereklidir ama her durumda derlenebilmeleri gerekli değildir. Şurada "body of the template must be syntactically correct even if never instantiated. Semantic analysis is not done until instantiation." diyor:

  https://dlang.org/spec/template.html

Bu, C++'ta da böyledir.

Demek ki kodun doğruluğu bile mixin'ler halledildikten sonraya bırakılıyormuş.

Ali