February 25, 2010

Dizgi sınıf şablonunu tanımlıyor. Dizgi, bir İm dizisini temsil eder. Aslında bütün işi, bir İm[] dizisini sarmalamak ve bir dizi gibi davranmak...

Özellikleri:

= alfabenin kurallarına göre küçük/büyük/aksansız dönüşümleri

= alfabenin kurallarına göre sıra karşılaştırmaları; bunu dört aşamada yapar

-- öncelikle, harflerin temel farklılıklarına bakılır: 'é' ve 'e' aynıdır; 'c' ve 'ç' farklıdır

-- ondan sonra dizginin uzunluklarına bakılır: kısa olan öncedir ('hal' 'hala'dan öncedir)

-- ondan sonra ilk aksan farkına bakılır: 'hal' 'hâl'den öncedir

-- ondan sonra küçük/büyük farklarına bakılır: küçük harf öncedir ('hal' 'Hal'den öncedir); Bu kuralın ASCII tablosundaki harflerin tersi olduğunu biliyorum ama sanki küçük harfleri önce görmek daha doğal geldi. Bunu düşünmeye devam edelim...

= temel harf ve dizgilerle de olabildiğince pürüzsüz çalışır

Linux'ta denemek için:

(Not: Windows ortamında oluşturma programlarına dokunmadım. Orada da yapılması gereken, trilerinin bütün .d dosyalarını derleme komut satırına eklemektir.)

  1. Son trileriyi indirin:

http://code.google.com/p/trileri/source/checkout

  1. (Kolaylık olsun diye) trileri klasörüne şu programı kaydedin:
import tr.dizgi;
import std.stream;
import std.cstream;

/*
* Kullanım kolaylığı için kısa bir isim:
*/
alias Dizgi!(AlfabeKodu.tur) dizgi_tr;

/*
* Yukarıdakini veya bir benzerini daha sonra kütüphaneye de eklemeliyiz
* ama henüz bu AlfabeKodu enum'undan ve alfabe kodlarından emin değilim.
*
* Belkide şöyle olmalı:
*
*    auto d = new Dizgi!türkAlfabesi("merhaba");
*    auto d = new Dizgi!("merhaba");
*    auto d = new türkAlfabesi.Dizgi("merhaba");
*
* Şimdilik düşünmeye devam...
*/

/*
* Girişten belirtilen alfabe türünden dizgi okur
*/
Dizgi!kod Dizgi_oku(AlfabeKodu kod)(Stream akım)
{
   char[] dizgi;
   akım.readf(&dizgi);
   return new Dizgi!kod(dizgi);
}

/*
* Bir üstteki işlevin kestirme hali
*/
Dizgi!(AlfabeKodu.tur) Dizgi_oku_tr(Stream akım)
{
   return Dizgi_oku!(AlfabeKodu.tur)(akım);
}

void main()
{
   string düzen = "% 20s: %s";

   dout.writef(düzen, "Bir sözcük girin", "");
   dizgi_tr sözcük = Dizgi_oku_tr(din);

   dout.writefln(düzen, "küçüğü", sözcük.küçüğü);
   dout.writefln(düzen, "büyüğü", sözcük.büyüğü);
   dout.writefln(düzen, "aksansızı", sözcük.aksansızı);
}
  1. Programı şu şekilde oluşturun (isminin dizgi_deneme.d olduğunu varsayıyorum):
dmd dizgi_deneme.d linux/build/libtrileri.a
  1. Çalıştırın:
/dizgi_deneme
   Bir sözcük girin: aâBCçdeéfGĞhıîijklmnoöpqrSştuÛüvWxYz
             küçüğü: aâbcçdeéfgğhıîijklmnoöpqrsştuûüvwxyz
             büyüğü: AÂBCÇDEÉFGĞHIÎİJKLMNOÖPQRSŞTUÛÜVWXYZ
          aksansızı: aaBCçdeefGĞhııijklmnoöpqrSştuUüvWxYz

dizgi_tr'den başka, onun yapı taşı olan İm şablonuna da bakmak isteyebilirsiniz:

import tr.im;
import std.cstream;

alias İm!(AlfabeKodu.tur) im_tr;

void main()
{
   im_tr ı = 'ı';
   im_tr i = 'i';
   im_tr I = 'I';
   im_tr İ = 'İ';

   assert(ı < i);
   assert(I < İ);

   dout.writefln(ı, i, I, İ);
}

Ali

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