October 24

Merhaba,

Derleme zamanı sabitler (enum) ve takma adlar (alias), D programlama dilinde öyle güçlü ki şablonlar haricinde bile veriler arasında cirit atabilirsiniz!

Cirit demişken, gelin bir hayvanat bahçemiz ve 4 de şirin yaratığımız olsun:

enum Animal { dog = 3, cow, fox, cat }

struct Zoo(Animal i)
{
  size_t count;
  enum index = i;
}

Burada çalışan görevli, sırayla hayvanların bakımını yapıyor ve her gün mesai bitiminde nerede kaldığını ve bütün gün kaç hayvan arasında gezdiğini öğrenmek istiyor. Sistem öyle tıkır tıkır işliyor ki önceki gün oluşturulan nesne (Zoo) yok edilmeden önce, kayıt edilen veriler ışığında hayvanların temizliğini yapmaya (yeni bir nesne ile) devam edecek. Yani aslında animals.cycle(index) gibi programın devamını implement etmeniz gerekecek. Ben sadece başlangıcı veriyorum...

void main()
{
  Animal[] animals;
  with(Animal) animals = [dog, cow, fox, cat];

  alias myType = Zoo!(Animal.fox);
  alias fun(S) = e => e == S.index;

  import std.algorithm : countUntil;
  auto myStruct = myType(
    animals.countUntil!(fun!myType)
  );

  assert(myStruct.index == 5);
  assert(myStruct.count == 2);

  import std.stdio;
  myStruct.writeln(": ", animals);
  // Zoo!Animal.fox(2): [dog, cow, fox, cat]
}

Belki kodu daha çok geliştirip, o gün kaç hayvan temizliği yaptıysa ekstra mesai ücreti (toplam günlük kazanç) hesaplanabilir. Neyse proje gayet basit, yaparsınız siz...:)

Asıl dikkatinizi çekmenizi istediğim konu alias (takma adlar). Bakınız burada 2 şekilde kullanımını görüyorsunuz ve biri parametre alıyor. Dikkat ederseniz bir lambda tanımladım çünkü counUntil() HOF'u bir lambda alabiliyor.

Bu konuyu buradaki tartışmadan esinlendim ve heyecanlandım, öyle ki birçok insanın fark edemediği bu gücü görmenizi istedim:

https://forum.dlang.org/thread/dmkltxdynmbrwbrwnute@forum.dlang.org

HOF: High Order Function

SDB@79