August 10, 2012

Merhaba,

GitHub'da dolaşıyorken bir şeye denk geldim: https://github.com/9rnsr/New-AA-implementation

Şu an kullandığımız sürümlerin birine uyarlandı mı bilmiyorum. Ama proje 5 ay önce güncellenmiş ve zannedersem bu önceki kullandığımızdan daha verimli çağrışımsal dizi yani eşleme tablosu olsa gerek. Denedim ve ihtiyacınız olan GitHub'daki yazılmış sınıf ile /dmd2/src/druntime/src/rt/util/hash.d dosyası. Bu ikisini, derlerken parametre olarak eklediğinizde test dosyaları çalışıyor.

Belki ilginizi çeken bir konudur...:)

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

February 02, 2013

Şurdaki (http://ddili.org/forum/post/8638) tartışmadan bu başlığı hortlatma gereği doğdu. Ha keza kendisi bunu fazlasıyla hak ediyordu...:)

Öncelikle 12 gün önce, çekirdek kod içine, bunun en güncel halini yüklemişler:
https://github.com/D-Programming-Language/druntime/blob/master/src/rt/aaA.d

Emin olmamakla birlikte, kullandığımız çağrışımsal dizinin temelini oluşturduğunu zannediyorum. Ancak dilersek aşağıdaki şekilde de kullanabiliriz:

import std.stdio,
      yeniAA;
alias yeniAA.AssociativeArray AA;

void main() {
 AA!(string,string) aa;
                    aa["Hello"]   = "Привет";
                    aa["Goodbye"] = "Пока";
                    aa["Thanks"]  = "Спасибо";

 foreach (k; aa.byKey) k.write("\t");

 writeln();

 foreach (v; aa.byValue) v.write("\t");
 /*
  *                      struct AssociativeArray(Key,Value) { // AA struct (0)
  *                             ================
  *                        Impl *impl;    // Reference semantics (1)
  *
  * byValue => return ValueRange(impl);
  *            static struct ValueRange {
  *               Range state;           // Range interface (2)
  *               this(Impl *p) { state = Range(p); } ...
  *
  *       v => return state.front.value; // Slots struct (3)
  *            ...ref Value front() pure nothrow @safe { // return }
  *            }
  * (1): Reference semantics
  *    struct Impl {
  *       Slot*[]  slots;
  *       size_t   nodes;
  *       Slot*[4] binit; // Prevent extra allocations for very small AA's.
  *    }
  * (2): Range interface
  *    struct Range {
  *       Slot*[] slots;
  *       Slot* curslot;  string[] deneme = [ "Hello", "Goodbye", "Thanks" ];
  *    }
  * (3): Slot interface
  *    struct Slot {
  *       Slot   *next;
  *       hash_t  hash;
  *       Key     key;   // alias Key keytype;
  *       Value   value; // alias Value valuetype;
  *    }
  */
  writeln();
}/*
Goodbye	Thanks	Hello
Пока	Спасибо	Привет
*/

Aslında ciddi farklılıkları var ve hangisinin yeni olduğunu bilmiyorum. Ama temelde aynılar (0) numaradaki gibi tüm içeriği taşıyan bir yapı var; ve bunun bir işaretçisi (1). Ayrıca bu işaretçi bir aynı isimde bir yapıyı işaret ediyor. Bunun yanında (2) ve (3) numaralı iki önemli yapı türü var. Olay bu kadar basitmiş! Bildiğimiz linked list'in hast-table ile desteklenmişi...:)

Aslında yukarısı çok kafa karıştırmış olabilir. Anlayabilmek için yukarıdaki özeti bizzat kod içinde kendiniz çıkartıp deneme yapmalısınız. Derlemek için şu komut yeterli oluyor:
Alıntı:

>

'
dmd testAA.d yeniAA.d ./rt/util/hash.d
'

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