July 11, 2012

Teşekkürler Kadir Can,

Nedeninden tam emin değilim ama internette kapamalarla (closure) ilgili olduğu konusunda yazılar bulunuyor. En azından şu çözüm işe yarıyor:

// Modül düzeyinde tanımlanmış olmalı:
double öğrenciNotOrtalaması(Öğrenci öğrenci)
{
   return öğrenci.ortalamaNot();
}

// ...

   auto sonuçlar = taskPool.map!öğrenciNotOrtalaması(öğrenciler);

Ali

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

July 11, 2012

Tam olarak anlamadığım başka bir çözüm daha buldum: Eğer yazıda gösterildiği gibi 3 parametresiyle denersek de çalışıyor:

   auto sonuçlar = taskPool.map!(ö => ö.ortalamaNot)(öğrenciler);    // derleme HATASI
   auto sonuçlar = taskPool.map!(ö => ö.ortalamaNot)(öğrenciler, 3); // derleniyor

Ali

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

July 11, 2012

Alıntı (Kadir Can):

>

Kapama kavramıyla ilgili aklıma bir şey takıldı. Sözlüğümüzden kontrol ettim, işlemleri ve işledikleri kapsamı bir arada saklayan program yapısı olarak tanımlanmış. Yani yanlış anlamadıysam temsilciler kapamalara örnek oluyor

Fonksiyonel dil geçmişim olmadığı için bu kavramları anlamam zaman almıştı. Yukarıdaki tanım aslında "temsilci"nin tanımı. Kapama olması için sanırım ek olarak bir işlevden dışarıya dönüş değeri olarak döndürülmesi gerekiyor:

import std.stdio;

auto kapamaDöndür(int i)
{
   int j = i * 2;
   alias int delegate(int) KapamanınTürü;
   KapamanınTürü kapama = x => x + j;    // yerel kapsamı kullanıyor
   return kapama;
}

void main()
{
   auto kapama = kapamaDöndür(42);
   writeln(kapama(1));
}

En azından TDPL'de verilen örneği öyle anlıyorum. Ayrıca 'alias'a neden gerek olduğundan hiç emin değilim.

Alıntı:

>

; peki {} olarak tanımladığımız kapsamlar kapamaya örnek oluyor mu?

Yalnızca {} salt kapsam belirliyor. Temsilci bile olabilmesi için öncelikle lambda olmalı tabii.

Alıntı:

>

Ayrıca burada hataya sebep olan şey doğru anladıysam lambda fonksiyon, değil mi?

Hatanın söylediğine bakılırsa lambda yerelmiş, ama yerel lambdalar taskPool.map gibi global olmayan şablonlara gönderilemiyorlarmış. (?)

Ali

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

July 11, 2012

Alıntı (erdem):

>

Maalesef ben de siz bu mesajı yazmadan önce denemiştim derlenmiyor.

Haklısın. :(

Ali

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

July 22, 2012

Alıntı (Kadir Can:1342003062):

>

Error: template instance amap!(__lambda5) cannot use local '__lambda5(__T4)' as parameter to non-global template amap(functions...)

Bu teknik bir yetersizlikmiş. Böyle bir durumu gerçekleştirebilmek için dmd'nin hem nesne göstergesini hem de kapsam göstergesini barındırması gerekirmiş ama ne yazık ki tek göstergeye yer varmış.

Bu durumla ilgili bir kaç hata raporu:

http://d.puremagic.com/issues/show_bug.cgi?id=3051

http://d.puremagic.com/issues/show_bug.cgi?id=3052

Özellikle bu bizimle ilgili çünkü David Simcha bu sıkıntıyı std.parallelism modülü yazarken yaşamış:

http://d.puremagic.com/issues/show_bug.cgi?id=5710

Benim tahminime göre, örnek kodlar önceki dmd sürümlerinin hataları nedeniyle deneniyordu ve belki de hatalı oluyordu ama basit örnekler hatayı göstermeye yetmiyordu. Bu hatalar 2.059'da giderilmiş ve bizim örnekler de kabak gibi ortada kalmış olabilir! :-p

Ali

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

1 2
Next ›   Last »