December 13, 2016

Teşekkürler! :) Sanırım şimdi anlamaya başladım.

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

December 12, 2016

Erdem, bu gibi ifadelerin tembel olduklarını biliyorsun: Ne işlem yapılacağını biliyorlar ama henüz hiçbir işlem yapmıyorlar. Yani, oradaki küçükHarf işlevleri tembel ifade döndürüyorlar. O ifadeleri değermişler gibi kullanamayız, ama aralıkmışlar gibi ilerletebiliriz.

Aralık gibi ilerletmeyi empty, front, ve popFront ile kendimiz yapabileceğimiz gibi, onları arka planda çağıran algoritmalar kullanabiliriz. Örneğin, küçükHarf'in döndürdüğü ifadeyi doğrudan writeln'a verebiliriz. writeln da elemanları teker teker çekerken tembel işlemlerin sonuçlarını görmeye başlar.

Dolayısıyla, ".html" gibi başka bir ifadeyle birlikte kullanabilmek için önce sonucu oluşturmak gerekiyor. Bunun bir yolu, tembel ifadenin sonuna .text algoritmasını eklemektir. std.conv.text, to!string'in biraz daha kullanışlısı: bütün parametrelerini string'e dönüştürür.

   import std.conv: text;
   string dosyaAdı =  kütükİsmi.text ~ ".html";

Ama hazır .text'i kullanmaya başlamışken, ~ işlevine de bulaşmamış oluruz. (DConf konuşmacılarından birisi ~ karakterinin yavaş anlamına geldiğini söylemişti. :) )

   string dosyaAdı =  text(kütükİsmi, ".html");

Bazı durumlarda biraz daha geliştirebiliriz: text'in oluşturduğu sonuç kısa olduğu sürece bir sorun yoktur. Ama sonuç çok uzun olduğunda çok bellek gerekecektir. Eğer sonuç örneğin yalnızca çıktıya yazdırılacaksa, yani karakterler geçici olarak kullanılacaklarsa, sonucu büyük bir bellek bölgesine dizi olarak yerleştirmeye gerek olmamalıdır. Böyle bir durumda birden fazla aralığı tek aralık gibi kullanmayı sağlayan chain'den yararlanabiliriz:

   import std.range: chain;
   auto dosyaAdı =  chain(kütükİsmi, ".html");

Ama yine başa döndük: Elimizde dizi değil, sonucu oluşturacak bir tembel ifade var. Gerekirse .array ile diziye dönüştürürüz, gerekmezse tembel ifadeden kullanırız. Örneğin, çıktıya göndeririz:

   import std.range: chain;
   auto dosyaAdı =  chain(kütükİsmi, ".html");
   writeln(dosyaAdı);

Tekrar etmek gerekirse, bu son sonucun değeri, sonuç için bellek ayırmaması, karakterleri tembel olarak oluşturmasıdır. Tabii, bu söylediklerimin bu kadar küçük dizgilerde hiç önemi yok. Bilinse iyi olur. :)
Ali

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

December 15, 2016

Peki 'ilkHarfBüyük' işlevini nasıl yapabilirdik?

Ben şöyle bir çözüm düşündüm ama cihanşümül değişkenlerden faydalanıyor.

auto ilkHarfBüyük(S) (S metin) if (isSomeString!S)
{
   return text(metin[].map!(h => ilkHarfBüyük(h)));
}

bool ilkkez = true;

dchar ilkHarfBüyük(in dchar karakter)
{
   if (ilkkez)
   {
       ilkkez = false;
       return büyükHarf(karakter);
   }
   return küçükHarf(karakter);
}

'ilkkez' değişkenini kullanmadan sadece ilk sefere mahsus başka bir işlevi çağırmanın başka yolu var mı acaba?

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

December 15, 2016

Evrensel değişken kesinlikle olmaz tabii. :) Yeni dizgiye başladığımızdan haberi olamaz. Ben şöyle bir şeyle mutlu olurdum:

auto ilkHarfBüyük(S) (S metin) if (isSomeString!S)
{
   import std.array: front, empty, popFront;
   import std.range: only, chain;

   assert(!metin.empty);

   auto başı = metin.front.büyükHarf.only;
   metin.popFront();
   auto gerisi = metin.küçükHarf;
   return chain(başı, gerisi);
}

Ali

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

1 2
Next ›   Last »