Thread overview
Temsilcileri anlamak
May 11, 2012
zafer
May 12, 2012
Salih Dinçer
May 12, 2012
Salih Dinçer
May 12, 2012

Merhaba,
Temsilciler konusunu hem dersaneden hemde C# tarafından bilgilerle irdelemeye çalışıyorum. Halen tam olarak anladığımıda söyleyemem, halen inceliyorum.

Dersanede anlatılanlara göre function ile bir örnek yaptım ve çalıştı. Ancak function yerine delegate yazınca olmuyor. Dersanede böyle çalışabileceği yazıyordu. Kodlar aşağıda yanlış yaptığım nedir?

import std.stdio;

void main()
{
	// Burada function yerine delegate yazınca olmuyor ?
	int function(int, int) gosterge;

	gosterge = &Topla;
	writefln("Topla : %s", gosterge(3, 5));

	gosterge = &Carp;
	writefln("Carp : %s", gosterge(3, 5));
}

int Topla(int sayi1, int sayi2)
{
	return sayi1 + sayi2;
}

int Carp(int sayi1, int sayi2)
{
	return sayi1 * sayi2;
}

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

May 12, 2012

Ali hocam ayrıntılı bir şekilde cevap vermiş; O'nun sözü üstüne söz gereksiz ama öğrendiklerimizi vurgulayalım...:)
Alıntı (zafer):

>

Dersanede anlatılanlara göre function ile bir örnek yaptım ve çalıştı. Ancak function yerine delegate yazınca olmuyor. Dersanede böyle çalışabileceği yazıyordu. Kodlar aşağıda yanlış yaptığım nedir?
Bahsettiğin satıra baktığımızda gösterge (pointer) eşitlendiği görünüyor. Sanırım temsilci ifade ettiği basit bir adresten daha farklı. Bunu "öğrenebilir miyiz" diye, şu satırla ekrana yazdım:

writefln("%s, %X, %X", gosterge, &Topla, &Carp);

Karşıma 'null' olan bir değişken ile iki adres çıktı. Eğer gosterge'nin eşitlendiği satırdan sonra bunu yaparsam, eşitlenen adresle aynı olduğunu gördüm ki bu beklediğimiz sonuç.

Sıra geldi temsilciye... Çünkü diğerlerini 'function('int, int')' ile denemiştim. Eşitlenen satırlardaki derleme hatası için satırları gizlediğimde; bu sefer "parçalama arızası" hatası aldım ve tüm hayallerim paramparça oldu...:)

Aslında kesin sonuçlu bir deneme olmasa da temsilcinin farklı bir şey olduğunu ve sadece adres barındırmadığını anlamış oldum. Ayrınca 'toDelegate()' işlevini de öğrenmiş olduk ki hocam ayrı bir teşekkür...

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

May 12, 2012

Pardon, diğer satırları gizlemeyi unuttuğum için parçalama hatası veriyormuş...

Oysa hata iletisi, "gorterge nasıl bir şey; göster bana?" sorusunu sorduğumda satıra işaret ediyordu ya, neyse hayallerim geri geldi şimdi...:)

Evet, gosterge şöyle daha nitelikli bir şeymiş:

'~/Masaüstü$ d.sh deneme
int delegate(int, int)'

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

May 12, 2012

Alıntı (zafer):

>

Halen tam olarak anladığımıda söyleyemem, halen inceliyorum.

Çok normal. Neden temsilci kullanacağımıza işlevi doğrudan çağırmıyoruz diye düşünülebiliyor.

Bir programcı bir işlev yazmış ama bir bölümünü bilmiyor. Onu parametre olarak bize bırakıyor. Biz de sonradan o bölümünü isimsiz işlev veya temsilci olarak veriyoruz.

Alıntı:

>

Ancak function yerine delegate yazınca olmuyor. Dersanede böyle çalışabileceği yazıyordu.

Sorun ne sende ne bende. :) Aslında temsilci denen dil olanağı bir çok iş başarıyor. Ben bunların çok işe yaradıklarını düşündüğüm bölümünü anlatmaya çalışmıştım. Tabii o bölümü yazmaya başladığım zaman hepsini ben de bilmiyordum. Tam olarak yerini söylersen hiç olmazsa bu yanlış anlamayı gidermeye çalışırım. Bu durumda soldaki sözlükte söylediğim doğru galiba: "temsilci: [delegate], oluşturulduğu ortamdaki değişkenlere erişebilen isimsiz işlev". Yani elimizde bir isimsiz işlev olduğu sürece doğru söylemişim. (Galiba. :))

Asıl kaynaklar şurada "Delegates, Function Pointers, and Closures" başlığı altında:

http://dlang.org/function.html

Ve şurada:

http://dlang.org/expression.html#FunctionLiteral

Birinci bağlantıya bakılırsa atladığım bilgiler şöyle:

  • Temsilciler static olmayan iç işlevleri de gösterebiliyorlar.

  • Temsilcilerin oluştuğu işlev göstergesi ve ortam göstergesi (stack frame pointer) .funcptr ve .ptr nitelikleri ile edinilebiliyor.

İkinci bağlantı ise benim odaklandığım noktayı içeriyor: İsimsiz işlevlerin temsilci olmaları...

Alıntı:

>
> // Burada function yerine delegate yazınca olmuyor ?
> 	int function(int, int) gosterge;
>
> 	gosterge = &Topla;
> ```

>

Onun nedeni, değer olarak kullandığın &Topla'nın bir işlev göstergesi olması. Yani tam bir function. Değer olarak bir isimsiz işlev kullansan olur:


int delegate(int, int) gosterge;

gosterge = (a, b) { return Topla(a, b); }; // Olur
gosterge = (a, b) => Topla(a, b); // Olur
writefln("Topla : %s", gosterge(3, 5));

gosterge = (a, b) { return Carp(a, b); }; // Olur
gosterge = (a, b) => Carp(a, b); // Olur
writefln("Carp : %s", gosterge(3, 5));



Ama senin düştüğün gibi durumlarda yardımcı olmak için std.functional.toDelegate de var:


import std.functional;

// ...

int delegate(int, int) gosterge;

gosterge = toDelegate(&Topla);
writefln("Topla : %s", gosterge(3, 5));

gosterge = toDelegate(&Carp);
writefln("Carp : %s", gosterge(3, 5));



Ali

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