Bu bir yazı dizisi olacak...
Aslında başlığı pekala "Aralıklarla Problem Çözme" olarak değiştirebiliriz çünkü zat-ı muhterem kendileri, matematiksel olsun olmasın her sorunu çözer diyebilirim ya da şöyle iddialı başlık atalım:
D Programlama Dilinde Aralıklar:
D dediğimizde aklımıza diziler (dolayısıyla dilimler) ve adeta iç içe geçmiş aralıklar (ranges) gelmelidir. Çünkü kütüphane olanağı olan std.array, std.range ve bunlar üzerinde akrobatlık yapabileceğiniz std.algorithm modülleri vardır.
Ve bu bir ders değildir, ders için Ali Çehreli'nin kitabındaki şu bölümleri okuyabilirsiniz:
Son olarak lütfen bu grubun (uluslararası resmi D forumunun tek alternatif dili olan Türkçe bölümün) şahsımın bloğu gibi görünmesine izin vermeyin! Aralarda hiç bir sorunuz yoksa bile "merhaba, zevkle okuyorum ve devamını bekliyorum!" yaz ve gönder gitsin bea ya...:)
import std.algorithm, std.range;
void main()
{
auto dizi = [0, 1, 2, 3, 4, 5, 6, 7, 8];
auto aralık = iota(9);
assert(aralık.equal(dizi));
import std.array;
auto artıkDizi = aralık.array;
assert(artıkDizi == dizi);
//...
Önce yukardaki temel konuyla başlayalım ve hemen arkasında bitirmek istediğim noktaya değineceğim. Yani yazı dizisi bittiğinde ulaşacağımız bilgi birikimi bu olacak. Lütfen hafife almayın, çünkü ben 10 senede ancak anladım!
Yukardaki satırlar kendilerini açıklıyor, değil mi? Peki bu sayıları, 0 hariç ikili parçalar (chunks) halinde toplayıp ekrana yazmak isteseydik ne yapacaktık?
import std.stdio;
aralık.dropOne // baştaki 0'ı geçer: aralıkta 1 adım ilerler
.chunks(2) // artık böyle: [[1, 2], [3, 4], [5, 6], [7, 8]]
.map!"a.front + a.back" // ama dikkat, bu bir dizi değil
.writeln; // [3, 7, 11, 15]
}
Bu bölümde kısa biri giriş yapmak istedim. Gönderir göndermez hemen 2. bölümü yazacağım ve muhtemelen siz bu satırları okuyorken zaten aşağıda şunlar olacak:
- aslında iota(9) ne demek, bunu bize pragma gösterecek
- en basit aralık (InputRange) nedir ve
- SonsuzAralık ve kendi _iota() işlevimizi yazalım.