Forum: Ders Arası RSS
Tembel parametreli işlev kullanımı
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Tembel parametreli işlev kullanımı
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.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4412 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
İş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
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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()); 
}
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  :-)
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4412 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-06-24, 12:03:50 (UTC -07:00)