Thread overview
Tembel parametreli işlev kullanımı
Feb 11, 2017
erdem
Feb 11, 2017
erdem
February 11, 2017
inout(V) get(K, V)(inout(V[K]) aa, K key, lazy inout(V) defaultValue)
{
   auto p = key in aa;
   return p ? *p : defaultValue;
}

inout(V) get(K, V)(inout(V[K])* aa, K key, lazy inout(V) defaultValue)
{
   return (*aa).get(key, defaultValue);
}

Tembel parametreli böyle bir işlevi nasıl kullanabiliriz. Burada anladığım kadarıyla anahtar ve değerler var ama bu işlevi nasıl çağırabiliriz.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 11, 2017

Teşekkürler.

En azından lazy kullanınca işlevin farklı çağrıldığını anladım.

import std.stdio;

void foo(int i, int k)
{
   writeln(i, " gönderen işlev beni çağırdı");
   writeln(k, " gönderen işlev beni çağırdı");
}
void bar(int i, lazy int k)
{
   writeln(i, " gönderen işlev beni çağırdı");
   writeln(k, " gönderen işlev beni çağırdı");
}

int beşGönder()
{
   writeln("Beş gönderiyorum");
   return 5;
}

int üçGönder()
{
   writeln("üç gönderiyorum");
   return 3;
}

void main()
{
   foo(beşGönder(), üçGönder());
   bar(beşGönder(), üçGönder());
}

Alıntı (acehreli):

>

bar'ın kazancı, i parametresi hiç kullanılmadığında ortaya çıkar: Belki de kullanılmayan değer için hesapla() çağrılmamış olur.

Ama bize nasıl bir faydası oldu anlamadım. Öyle ya kullanmayacaksak niye yazalım.

En azından bellek tasarruf yapmış oluruz :-)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 11, 2017

İşlev parametresi olarak ifade gönderebiliriz: 42, foo() + bar(), vs. Parametre lazy olunca, o ifade işlev işletilmeden önce değil, işlev içinde kullanıldığı her yerde işletilir. lazy parametre değeri perde arkasında bir delegate olarak kullanılır.

Şöyle iki işlev olsun:

void foo(     int i) { writeln(i, i); }
void bar(lazy int i) { writeln(i, i); ]

Her ikisini de şöyle çağıralım:

foo(hesapla());
bar(hesapla());

foo'nun durumunda işlemler şu sırada işletilir ve şu kodların eşdeğeridir:

// foo çağrıldığında:
int hesapSonucu = hesapla();
writeln(hesapSonucu, hesapSonucu);
// bar çağrıldığında:
writeln(hesapla(), hesapla());

bar'ın kazancı, i parametresi hiç kullanılmadığında ortaya çıkar: Belki de kullanılmayan değer için hesapla() çağrılmamış olur. (Öte yandan, bu örnekte iki kere kullanıldığından iki kere çağrılmaktadır.)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 12, 2017

Bunun örneği, gösterdiğin get() işlevinde var: get(), eleman varsa değerini, yoksa defaultValue parametresini döndürür. Yani, defaultValue'yu bazen kullanır. O yüzden lazy işine yarıyor.

Başka bir örnek log işlevleridir. Şu işlev ikinci parametresini lazy almış olsun:

log(DEBUG, format("Bilmemne miktarı: %s", foo()));

log işlevi, format ifadesini ancak program DEBUG düzeyinde log gösterecek biçimde ayarlandıysa işletir.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]