December 02, 2013

Merhaba,

Aradan geçen yaklaşık 1 senenin ardından, çok sevdiğim başlığıma (belki küçük bir proje) geri dönüş yaptım...:)

Buna sebep; her ne kadar yığıt yapıları, çok çeşitlendirmeye/yeni özellikler eklemeye müsait olsa da işler zamanla karışacağından tıpkı yukarıdaki son iletim gibi miras alma ve belki arayüz(interface) oluşturma gerekliliği doğurabilir. Çünkü Ali hocam çok tehlikeli bir şeyden bahsetmişti:

Feature Creep (http://en.wikipedia.org/wiki/Feature_creep)

Ali hocam geçenlerde, benim değinmem üzerine yine başka bir şeyden daha bahsetti:
Alıntı (acehreli:1384706328):

>

Klasik veri yapılarının hepsinin olması şart. D'de standart kabul edilebilecek benim bildiğim iki seçenek var:

http://dlang.org/phobos/std_container.html

https://github.com/schveiguy/dcollections

Ancak, ikisi de modern Phobos'a uymuyorlar. Yeni bir topluluk modülü gelecek ama onun olabilmesi için öncelikle şu anda taslak aşamasında bulunan std.allocator modülünün tamamlanması gerekiyor.

Taslak yapıdaki konuya uzak olduğum için, tam olarak 'modern Phobos'dan kastın neydi tam bilmiyorum; ama ben, kendi uygulamalarım için, foreach() içinde ve pratik bir şekilde kullanabilmek benim için yeterince modern görünüyor. O yüzden geliştirmelerimi bu bağlamda devam etmek istiyorum...

Az önce, yazılanları hızlıca okuma (read over) fırsatım oldu. Yığıt içine FIFO'yu yedirme çabam olduğunu ama bunu unuttuğumu fark ettim. Acaba işleri çok karıştırmadan LIFO ile FIFO ortak bir paydada birleştirilebilir mi?

Tamam, belki yığıt olmaktan çıkacak ama top() dahil belki bizi bir çok şeyden kurtaracak! Adeta dizinin başı ve sonu üzerinde cirit atmamızı sağlayabilir...:)

Bugün küçük bir deneme yapmayı düşünüyorum...

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

December 02, 2013

Aşağıdaki gibi basit bir şey kodladım. Yığıt, 2 özelliği barındırdığı için fazladan rewind() işlevine ihtiyaç duydum ve bir nevi Flip/Flop gibi çalışıyor. Yani LIFO durumundayken FIFO'ya geçirebilirsiniz veya tersi...:)

 import std.stdio;

 class Yığıt(T) {
   int index;
   T[] stack;

   alias back = front;

   this(T[] data) {
     this.stack = data;
     rewind();
   }

   @property:

   void push(T data) {
     this.stack ~= data;
   }

   void rewind() { // LIFO <> FIFO
     if(index < 0) {
       index = 0;
     } else {
       index = cast(int)stack.length - 1;
     }
   }

   bool empty()  {
     auto FIFO = (index == stack.length);
     auto LIFO = (index < 0);

     return FIFO || LIFO;
   }

   T front() const{ // LIFO
     return stack[index];
   }

   void popFront() {    --index;       }

   void popBack()  {    ++index;       }
 }

void main() {
 int[] numbers = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ];
 auto test = new Yığıt!int(numbers);

 test.push(13);  // yeni bir değer gönderiliyor ama (!)
 test.rewind();  // popFront() bize öncesini verebilirdi...

 foreach(t; test) {  // LIFO
   t.write(",");
 }
 putchar(8);" ".writeln(); // sondaki fazla virgülü siler...

 test.rewind(); // FIFO'ya boş aralık dönmemesi için!

 foreach_reverse(t; test) { // FIFO
   t.write(",");
 }
 putchar(8);" ".writeln(); // sondaki fazla virgülü siler...
}/*Çıktısı:
13,12,11,10,9,8,7,6,5,4,3,2,1
1,2,3,4,5,6,7,8,9,10,11,12,13
*/

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

December 02, 2013

Alıntı (Salih Dinçer):

>

Taslak yapıdaki konuya uzak olduğum için, tam olarak 'modern Phobos'dan kastın neydi tam bilmiyorum;

Bazı modüllerin başında da yazıyorlar: "Warning: This module is considered out-dated and not up to Phobos' current standards. It will remain until we have a suitable replacement, but be aware that it will not remain long term."

http://dlang.org/phobos/std_xml.html

Ben en çok "Phobos'un diğer modülleriyle pek uyumlu olmamak" diye anlıyorum. Örneğin, aralık arayüzü sunmuyorsa std.algorithm ve std.range ile kullanılamaz.

std.allocator'ın taslağı ile ilgili bağlantılar ve tartışması şurada:

http://forum.dlang.org/thread/l4btsk$5u8$1@digitalmars.com

Alıntı:

>

Adeta dizinin başı ve sonu üzerinde cirit atmamızı sağlayabilir...:)

Belki de double-ended queue'ya dönüşecektir. :) C++'taki std::deque topluluğu gibi...

Ali

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

December 03, 2013

Alıntı (acehreli):

>

Belki de double-ended queue'ya dönüşecektir. :) C++'taki std::deque topluluğu gibi...
Çok kapsamlı bir taşıyıcı (container) imiş: http://www.cplusplus.com/reference/deque/deque/

Bugün çift yönlü bu yığıtı kullanırken bir kaç eksikliğini tespit ettim. Bahsettiğin olacak gibi görünüyor ama işe bak ben karışmasın istiyorum. Demek ki bir şey ek nitelikler verdikçe karmaşıklaşmasından kaçamıyoruz...:)

Sevgiler, saygılar...

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

December 04, 2013

Ben yanlış anlamışım: deque, iki ucundaki elemanlara eriştirir. (Aslında, doğal bir BidirectionalRange.) Seninki bütünüyle doğasını değiştiriyormuş.

Sondaki fazla virgülü silme işi de hep belalı oluyor. Ben artık onun gibi alt düzey sorunlarla uğraşmak zorunda kaldığımda hep üst düzey bir çözümü unutmuş olacağımı düşünmeye başladım. Örneğin, o for döngüleriyle aslında şunu söylemek istiyoruz: Aralarında virgülle yazdır. main'in sonu şöyle değiştirilebilir:

import std.range;
// ...
   writefln("%(%s,%)", test);
   test.rewind();
   writefln("%(%s,%)", test.retro);

%( düzen belirteçleri sona ayraç yazmayacak kadar akıllılar. Ama retro'nun işleyebilmesi için Yığıt'ın bir BidirectionalRange'e dönüştürülmesi gerekiyor.

Onun için save() üye işlevinin eklenmesi gerekir:

   Yığıt save()
   {
       Yığıt kopya = this;
       return kopya;
   }

Fazla virgülü eklemeyen başka bir işlev de std.algorithm.joiner:

import std.stdio;
import std.algorithm;

void main()
{
   writeln([ "bir", "iki" ].joiner(","));    // bir,iki yazar
}

Ama o çözümde ayraçla elemanların aynı türden olmaları gerekiyor ("," de string elemanlar da).

Ali

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

December 05, 2013

Bu çözümlerden, en azından gruplama düzen belirteçini biliyorum ki bununla ilgili bir başlık açmıştın. Ama char(8) karakterini konsol uygulamaları için çok seviyorum; yazılıma neredeyse hiç bir yük getirmiyor. Bazense foreach()'in index'ini bir if() ile kontrol ederek bunu sağlayabiliyorum.

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

1 2 3
Next ›   Last »