Herkese merhaba,
Ali hocanın ders örneğindeki sorunun sonuçlarını her seferinde ekrana yazdığımızda tükettiğimizi (sanırım buna hevesli mi diyorduk?) gördüm. Sanki her bir satır, öncekinin bıraktığı bayrağı yerden alıp Fibonacci Maratonu'nda koşmaya devam ediyordu...:)
Yani aşağıdaki çiftli örneğin devamında, ekrana yazdırma satırlarından sadece sonuncuyu etkin bırakırsanız istediğim sonuç (13 ve 21) çıkmakta. Buradan kod içinde değişiklik yapmamız gerektiği sonucu çıkabilir mi?
Değişikliği sadece main()'den sonraki ilk satırın başına // koyduğunuzda altındakinin etkin olduğunu (toggleMark*) ve aralığın daha doğru çalıştığını görmekteyiz.
import std.algorithm, std.concurrency;
import std.stdio, std.range;
struct FibonacciRange {
long a = 0, b = 1;
enum empty = false;
long front() const {
return a;
}
void popFront() {
auto t = a;
a = b;
b = t + b;
}
}
/* Bu alias std.range.Generator ile olan bir isim
* çakışmasını gidermek içindir.
*/
alias FiberAralığı = std.concurrency.Generator;
void fibonacciSerisi() {
int baştaki = 0;
int sonraki = 1;
while (true) {
yield(baştaki);
const ikiSonraki = baştaki + sonraki;
baştaki = sonraki;
sonraki = ikiSonraki;
}
}
void main() {
auto range = new FiberAralığı!int(&fibonacciSerisi);/*
FibonacciRange range;//*/
auto fib10 = range.take(10);
typeof(fib10).stringof.writeln;
writefln("[%(%s, %)]\n", fib10);
auto fibTek = fib10.filter!(n => n % 2);
typeof(fibTek).stringof.writeln;
writefln("[%(%s, %)]\n", fibTek);
auto son10FibTek = fibTek.filter!(x => x > 10);
typeof(son10FibTek).stringof.writeln;
writefln("[%(%s, %)]\n", son10FibTek);
} /* Çıktısı:
* Take!(Generator!int)
* [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
*
* FilterResult!(__lambda1, Take!(Generator!int))
* [55, 89, 233, 377, 987, 1597, 4181]
*
* FilterResult!(__lambda2, FilterResult!(__lambda1, Take!(Generator!int)))
* [6765, 17711, 28657, 75025, 121393, 317811, 514229]
*/
*
Ben buna kısaca toggleMark diyorum çünkü satır sonundaki etkisiz //*/
karakterler üsteki başka satırlar ile etkileşime girebiliyor. Aynı şeyi blok kodlarda, iki blok arasına /*/
koyarak da yapabilirsiniz. Bu trick pek az kişi tarafından bilinmekte ve Python gibi diller haricinde kullanıp kullanmamakta serbestsiniz!
Başarılar...