July 11, 2016

Selamlar;

"map" fonksiyonuna şu aşağıdaki şekilde "map!(a => rowFinder(a))" bir fonksiyon gönderirken bir yardımcı fonksiyon kullanmak zorunda kaldım. Halbuki isteğim tek satırda işimi bitirmekti.

int rowFinder( int number )
{
if ( number == 0 )
return 3;
else
return (number-1) / 3 ;
}

int main(string[] argv)
{
..
auto numList = to!dstring(stdin.readln().chomp()).map!( a => to!int(a) - 48 ).uniq().array();
..
auto minVal = numList.reduce!(min);
auto maxCol = numList.filter!(a => a != minVal ).map!( a => rowFinder(a) ).reduce!(max);
..
}

Olmasını istediğim formatta şuydu: map!( a => if (a == 0) a = 3; else a = a -1 /3 ; )
Fakat bunu derleyedim. Mutlaka benim beklentim de dilin bilmediğim noktalarından dolayı sorunlar çıktı.

Sizlere iki sorum var,

1 - Fonksiyon alan standart kütüphane metodlarına lambdalar ile fonksiyon gönderirken koşul ifadeleri tek satırda nasıl yazabilirim?

2 - Asıl daha çok şey öğreniceğim soru; yukarda benim düşüncemin çalışmamasının nedeni tam nedir acaba?

Erdemdem

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

July 11, 2016

Temel sorun, if'in bir deyim olması... Deyimler değer değildirler, ifadeler değerdirler. map, ifade alıp değer ürettiğinden '=>' işlecinin sağ tarafına bir ifade koymamız gerekiyor.

Bu durumdaki en kolay çözüm, '?:' işlecini kullanmaktır (buradaki kodları derlemeden yazıyorum):

   map!( a => (a == 0 ? 3 : a -1 /3))

Ama daha karmaşık durumlarda işlev kullanmaktan başka çare yok ve sakıncası da yok:

// :)
auto şuHaleGelmişleri(R)(R aralık) {
   // Gerekirse yerel işlev olarak saklanabilir de:
   auto karmaşıkİşlev(E)(E eleman) {
       // ...
       return birSonuç;
   }

   return aralık.map!(e => karmaşıkİşlev(e));
}

// ...

   numList.şuHaleGelmişleri.filter!(vs).map!(vs).vs.;

Ali

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