D Programlama Dili – Programlama dersleri ve D referansı
Ali Çehreli

çokuzlu: [tuple], bir kaç parçanın diziye benzer biçimde bir araya gelmesinden oluşan yapı
döngü açılımı: [loop unrolling], döngü içeriğinin her eleman için art arda tekrarlanması
etiket: [label], kod satırlarına isimler vermeye yarayan olanak
hazır değer: [literal], kod içinde hazır olarak yazılan değer
isim alanı: [name scope], ismin geçerli olduğu kapsam
kapsam: [scope], küme parantezleriyle belirlenen bir alan
yükleme: [overloading], aynı isimde birden çok işlev tanımlama
... bütün sözlük



İngilizce Kaynaklar


Diğer




static foreach

Derleme zamanı foreach olanağını daha önce Çokuzlular bölümünde görmüştük. O olanak, döngünün derleme zamanında işletilmesini ve kod olarak açılmasını sağlar. Örnek olarak bir çokuzlu üzerinde işletilen aşağıdaki döngüye bakalım:

    auto t = tuple(42, "merhaba", 1.5);

    foreach (i, üye; t) {
        writefln("%s: %s", i, üye);
    }

Derleyici döngüyü aşağıdaki eşdeğeri olarak açar:

    {
        enum size_t i = 0;
        int üye = t[i];
        writefln("%s: %s", i, üye);
    }
    {
        enum size_t i = 1;
        string üye = t[i];
        writefln("%s: %s", i, üye);
    }
    {
        enum size_t i = 2;
        double üye = t[i];
        writefln("%s: %s", i, üye);
    }

Çok güçlü bir olanak olmasına karşılık, bu olanak her durumda kullanışlı olmayabilir:

void main() {
    enum dizi = [1, 2];
    // Derleme zamanında açılmaz, çalışma zamanında işletilir
    foreach (i; dizi) {
        // ...
    }
}
import std.meta;

// Modül düzeyinde işlev yüklemeleri tanımlamaya çalışılıyor:
foreach (T; AliasSeq!(int, double)) {    // ← derleme HATASI
    T ikiKatı(T sayı) {
        return sayı * 2;
    }
}

void main() {
}
Error: declaration expected, not foreach

static foreach bu konularda daha fazla seçim sağlayan daha güçlü bir olanaktır:

    static foreach (n; FibonacciSerisi().take(10).filter!çift_mi) {
        writeln(n);
    }

Yukarıdaki döngü aşağıdaki eşdeğeri olarak açılır:

    writeln(0);
    writeln(2);
    writeln(8);
    writeln(34);
import std.meta;

static foreach (T; AliasSeq!(int, double)) {
    T ikiKatı(T sayı) {
        return sayı * 2;
    }
}

void main() {
}

Yukarıdaki döngü aşağıdaki eşdeğeri olarak açılır:

    int ikiKatı(int sayı) {
        return sayı * 2;
    }

    double ikiKatı(double sayı) {
        return sayı * 2;
    }
import std.stdio;

void main(string[] parametreler) {

switchDeyimi:
    switch (parametreler.length) {
        static foreach (i; 1..3) {
            case i:
                writeln(i);
                break switchDeyimi;
        }

    default:
        writeln("varsayılan davranış");
        break;
    }
}

Yukarıdaki döngü açıldığında bütün switch deyimi aşağıdakinin eşdeğeridir:

    switch (parametreler.length) {
    case 1:
        writeln(1);
        break;

    case 2:
        writeln(2);
        break;

    default:
        writeln("varsayılan davranış");
        break;
    }