ustad, ne diyosun? :)
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
| Thread overview | |||||
|---|---|---|---|---|---|
|
December 21, 2010 InputRange örneği | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | ustad, ne diyosun? :) -- | |||
December 21, 2010 InputRange örneği | ||||
|---|---|---|---|---|
| ||||
Daha önce bir OutputRange örneği yazmıştım: http://ddili.org/forum/thread/421 O iş 'put' işlevini tanımlamak kadar kolaydı. Aralık denemelerime devam ediyorum... :) Bir türün InputRange olarak kabul edilebilmesi için empty, popFront, ve front işlevlerini tanımlaması gerekir. empty: aralık boş kabul edildiğinde 'true', değilse 'false' döndürmelidir front: aralığın başındaki elemanı döndürmelidir popFront: aralığı baş tarafından daraltmalıdır Ayrıca, eğer empty 'true' döndürüyorsa, diğer iki işlevin çağrılması yasal değildir. Bunlarla ilgili bilgi şurada "foreach desteğini aralık işlevleri ile sağlamak" başlığı altında da vardı: http://ddili.org/ders/d/foreach_opapply.html O üç işleve sahip olması türün InputRange olması için yeterlidir. (O derste de görüldüğü gibi ve bence D'nin biraz ilginç bir olanağı sonucunda da türün foreach ile çalışabilmesini de sağlıyor.) InputRange örneği olarak şöyle bir sınıf düşündüm: Elimizde bulunan bazı değerleri komşu değerlerin ortalamalarını alarak azaltmak isteyelim. Örneğin 1, 2, 3, 4 değerlerini ikişer ikişer ortalayarak 2 değere indirebiliriz: (1+2)/2 ve (3+4)/2. Yani 1.5 ve 3.5. (Bunu, bir büyüklüğün belirli aralıklarla ölçülmüş değerlerini yuvarlamak için kullanabiliriz. Örneğin bir grafiği daha küçük göstermek istemişizdir ve 1000 noktayı onar onar ortalayarak 100 nokta olarak göstermek istemişizdir.)
Çıktısı: 'Asıl değerler: [0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 11] Artık bu sınıfı Phobos'un InputRange kullanan algoritmalarıyla da kullanabiliriz. Örneğin 'findAmong', bir aralıkta bulunan elemanları başka bir aralıkta arar ve bulduğu ilk elemandan gerisini yeni bir aralık olarak döndürür:
Bir önceki çıktıda 2.75 değerini gördüğüm için aranacak değerlerin arasına bir tane de ondan yerleştirdim: [ 0, 1, 2.75, 7, 10 ] :). findAmong 2.75'i ortalanmış aralıkta bulur ve gerisini sonuç olarak döndürür: 'Bulunan elemandan başlayan sonuç aralık: 2.75 4.95 7.15 9.35 ' (Not: Kesirli sayıları eşitlik karşılaştırmalarına sokmak genelde yanlıştır. Ben, kesirli kısmı ikinin katlarına bölünmüş bir değer olduğu için 2.75'i seçtim: 2 + 1/2 + 1/4, kesirli bir değer olduğu halde eşitlik karşılaştırmalarından sağlam çıkar. :)) Tamam; amacımıza ulaştık ve hem foreach ile hem de InputRange gerektiren algoritmalarla çalışabilen bir tür yazdık. Ali -- | ||||
December 21, 2010 InputRange örneği | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Mengu | Mengü, sorunu biraz daha açar mısın... :-p :D :D D'nin aralıklarını (ranges) tanımak için deneyler yapıyorum. Bir yandan da başımdan geçenleri yazıyorum. Pek bir anlaşılmaz olduğunu biliyorum ama yine de örnek olarak bir kenarda bulunsunlar. Devamı gelecek... :) Ali -- | |||