Forum: Projeler trileri RSS
Alfabe için otomatik kod üretimi
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4508 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Alfabe için otomatik kod üretimi
Alfabeleri oluşturma işinde yardımı olsun diye küçük bir program yazdım. D kodu üretiyor.

Benim sistemimdeki /usr/share/X11/locale/en_US.UTF-8/Compose dosyasını; sistemdeki grep, sed, vs. programları kullanarak tarıyor ve sonuçta çıktıya şöyle bir D kodu yazıyor:

module tr.harfler;
 
/*
 * UYARI: Bu dosya otomatik olarak üretilmiştir.
 *        Değişikliklerinizi kaybedebilirsiniz.
 */
 
struct Harf
{
    dchar kod;
}
 
// ... kısaltarak gösteriyorum ...
 
immutable a       = Harf     ('a');
immutable A       = Harf     ('A');
immutable a_aksan = HarfGrubu("àáâãäåāăąǎǟǡǻȁȃȧḁạảấầẩẫậắằẳẵặⓐ");
immutable A_aksan = HarfGrubu("ÀÁÂÃÄÅĀĂĄǍǞǠǺȀȂȦḀẠẢẤẦẨẪẬẮẰẲẴẶⒶ");
immutable a_hepsi = a ~ a_aksan;
immutable A_hepsi = A ~ A_aksan;
 
// ... 

Üretilen o dosyayı da trileri'ye ekleyeceğim ve alfabeleri o parçaları bir araya getirerek oluşturacağım:

a ~ a_aksan ~ b ~  b_aksan ~ c ~ ç ~ (c_aksan - ç) ~ ... z

Nasıl olacağından tam emin değilim daha... :)

Yukarıda gösterdiğim Compose isimli dosyada şöyle satırlar var:

<dead_circumflex> <a>                : "â"   U00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX

Program, kodu oradaki â gibi karakterleri toplayarak üretiyor. Ama kod mükemmel değil. Üzerinde oynamam gerekti. Üretilen kod üzerinde elle değişiklik yaptığım için, üreten programı projeye eklemek istemedim. Örneğin üretilen kodun içine gereken yerlere uyarılar koyuyor:

// XXX Farklı uzunluk
immutable b       = Harf     ('b');
immutable B       = Harf     ('B');
immutable b_aksan = HarfGrubu("ƀḃḅḇⓑ");
immutable B_aksan = HarfGrubu("ḂḄḆⒷ");
immutable b_hepsi = b ~ b_aksan;
immutable B_hepsi = B ~ B_aksan;

Oradaki karakterinin büyüğü yok; onun için onu çıkarttım. Böyle başkaları da var...

Dosyayı harfler.d olarak projeye ekleyeceğim.

Üreten program da şu:

import std.process;
import std.cstream;
import std.uni;
import std.conv;
import std.string;
 
void main()
{
    dout.writefln(dosyaBaşlığı);
 
    harfleriÜret("aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ");
}
 
void harfleriÜret(string latinler)
{
    for (int i = 0; i != latinler.length; i += 2) {
        harfiÜret(latinler[i], latinler[i + 1]);
    }
}
 
void harfiÜret(char küçük, char büyük)
{
    dstring küçük_aksanlılar = aksanlıları("SMALL", küçük);
    dstring büyük_aksanlılar = aksanlıları("CAPITAL", büyük);
 
    if (küçük_aksanlılar.length != büyük_aksanlılar.length) {
        dout.writefln("// XXX Farklı uzunluk");
    }
 
    dout.writefln(`immutable %s       = Harf     ('%s');`, küçük, küçük);
    dout.writefln(`immutable %s       = Harf     ('%s');`, büyük, büyük);
    dout.writefln(`immutable %s_aksan = HarfGrubu("%s");`, küçük, küçük_aksanlılar);
    dout.writefln(`immutable %s_aksan = HarfGrubu("%s");`, büyük, büyük_aksanlılar);
    dout.writefln(`immutable %s_hepsi = %s ~ %s_aksan;`, küçük, küçük, küçük);
    dout.writefln(`immutable %s_hepsi = %s ~ %s_aksan;`, büyük, büyük, büyük);
    dout.writefln();
}
 
dstring aksanlıları(string küçük_büyük_belirteci, char harf)
{
    string kaynakDosya = "/usr/share/X11/locale/en_US.UTF-8/Compose";
 
    // Örnek: "LATIN SMALL LETTER A"
    string belirteç = "LATIN " ~ küçük_büyük_belirteci ~ " LETTER "
                      ~ `.*\<` ~ text(toUniUpper(harf)) ~ `\>`;
 
    string harfSatırınıSeçen = `grep -w '` ~ belirteç ~ `' ` ~ kaynakDosya;
    string satırınBaşınıSilen = `sed 's/.*: "//g'`;
    string satırınSonunuSilen = `sed 's/ # .*//g'`;
    string çiftSatırlarıSilen = `uniq`;
    string harfiYalnızBırakan = `sed 's/".*//g'`;
    string satırSonuKarakteriniSilen = `sed ':a;N;$!ba;s/\n//g'`;
 
    string bütünKomut = harfSatırınıSeçen
                        ~ "| " ~ satırınBaşınıSilen
                        ~ "| " ~ satırınSonunuSilen
                        ~ "| " ~ çiftSatırlarıSilen
                        ~ "| " ~ harfiYalnızBırakan
                        ~ "| " ~ satırSonuKarakteriniSilen;
 
    return dtext(strip(shell(bütünKomut)));
}
 
auto dosyaBaşlığı =
// ------------------------------------
q{module tr.harfler;
 
/*
 * UYARI: Bu dosya otomatik olarak üretilmiştir.
 *        Değişikliklerinizi kaybedebilirsiniz.
 */
 
struct Harf
{
    dchar kod;
}
 
struct HarfGrubu
{
    dstring grup;
 
    HarfGrubu opSub(Harf çıkan) const
    {
        dstring sonuç;
 
        foreach (harf; grup) {
            if (harf != çıkan.kod) {
                sonuç ~= harf;
            }
        }
 
        return HarfGrubu(sonuç);
    }
 
    HarfGrubu opCat_r(Harf eklenen) const
    {
        return HarfGrubu(eklenen.kod ~ grup);
    }
}
};
// ------------------------------------ 

Daha önce kullanmadığım bazı olanaklar var:

- `merhaba` gibi ters kesmeli dizgiler
- kod yazabilmek için q{ ... } dizgileri
- std.process modülündeki shell işlevi; çalıştırdığı komutun çıktısını string olarak döndürüyor

Ali
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4508 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Nasıl kullanıldığını da söyleyeyim:

Linux sisteminizde /usr/share/X11/locale/en_US.UTF-8/Compose isimli dosya bulunduğunu varsayarsak, ve yukarıdaki programı harf_uretici.d diye kaydettiğinizi varsayarsak:

dmd harf_uretici.d
./harf_uretici > harfler.d

harfler.d dosyasının içinde alfabeyi oluşturacak parçalar olacaktır.

Ali
canalpay (Moderatör) #3
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Güzel ama nasıl sadece resmi alfabeyi desteklemek istemiyorsak sadece linux'u da desteklemekte istemeyebiliriz.
Onun içinde eğer trileri bu kodu çalıştıramazsa öntanımlı olarak şuanki çıktıda aldığınız değerleri kullanabiliriz.

Bu arada harfin unicode değerini kullanıp arada kalan karakterler için double değer vermek yerine artık kendi tablomuzu oluşturabiliriz. Eğer tanımladığımız tabloda değer var ise tablodan değeri alırız yok eğer yok ise unicode'dan değeri alırız. Örnek olarak icmp_tr("ç", "d") için tablodan değeri alırken icmp_tr("ç","<") için < karakterinin tabloda değeri olmadığı için ç'ninde <'ründe unicode ile değerini alırız. Ama değeri alırken ç'yi c'ye dönüştürüp c'nin değeri alınmalı.
Phobos, bu trileri kütüphanesinin işini otomatik olarak halledecekti, ne oldu ?

Sanırım şuan topluluğun(Andrei Alexandrescu) daha önemli işleri var gibi gözüküyor. Topluluk arasında D2 gelişimi durdurulsun diyenler var. Ya da temel özellikleri tamamlansın önemli hatalar giderilsin daha sonra D2+ ya da D3 şeklinde yeniden tüm özellikleri ile geliştirilebilir diyenler var.

Yani otomatik halletme işi yaş. Tango kütüphanesine bakmak gerekebilir. Çünkü tango daha gelişmiş olduğu için belkide bu işi kendi yapıyordur.  Belkide yapmıyordur...
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4508 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Onun içinde eğer trileri bu kodu çalıştıramazsa öntanımlı olarak şuanki çıktıda aldığınız değerleri kullanabiliriz.

Amacım oydu zaten. Kod gelişimi yalnızca bir kerelik bir işti. Artık harfler.d'yi trileri'ye ekledim.

Bu arada harfin unicode değerini kullanıp arada kalan karakterler için double değer vermek yerine artık kendi tablomuzu oluşturabiliriz.

Evet, yine amaç o. Alfabeyi böyle harflerin bileşimi olarak tarif ettikten sonra, gerisinin otomatik olmasını hayal ediyorum.

Eğer tanımladığımız tabloda değer var ise tablodan değeri alırız yok eğer yok ise unicode'dan değeri alırız.

Kesinlikle... Ama double değil de long kullanabiliriz. Unicode'dan alınan karakterlerin değerlerini 32 bit (veya başka bir miktar) sola kaydırarak...

Aslında çok yakın bir arkadaşım bu işlerin uzmanı. Microsoft'un yazım denetimi araçlarını yapan kişi. Yanılmıyorsam Türkçe için o kapsamda başka bir çözüm yok. Haftada en az iki kere görüşüyoruz.

Onun çözümünde 5-6 tane 65K'lık tablo varmış. Tabii yalnızca sıralama değil, yazım denetimi için dilin istisnalarını filan da tutuyor. O, alfabe harflerine tamamen kendi belirlediği sıra numaraları vermiş. Örneğin a==0, b==1, vs. Alfabede olmayan bütün karakterler, alfabe harflerinden sonra geliyorlarmış.

Benim kafamda ise, nedense, bütün Unicode karakterleri kendi kodlarının sırasında dursunlar; bizim yaptığımız ise o tabloyu herhangi bir alfabe için düzeltmek olsun. Yani örneğin Türk alfabesi için ç, c ve d'nin arasına gelsin. Bunu söylediğimde "bir sonraki harfi ver" gibi bir işlemin yavaş olacağını söyledi. Çünkü ç'nin kodunu arttırmak yanlış olur.

Bütün o bilgi, ç'den sorumlu bir veri yapısında durabilir ve bir sonraki harf oradan bulunabilir. Bütün ç'ler aynı bilgiyi paylaştıkları için, burada Flyweight Design Pattern kullanılabilir:

  http://en.wikipedia.org/wiki/Flyweight_pattern

Bence güzel çözümler bulunacak. Önemli olan, hepsini birden çözmeye çalışmamak. :)

Aslında bütün bu çok zor bir konu. Örneğin kesme işareti sıralamada gözardı edilmeli, değil mi...

Phobos, bu trileri kütüphanesinin işini otomatik olarak halledecekti, ne oldu ?

Söylediğin gibi, başları sıkışık.

Topluluk arasında D2 gelişimi durdurulsun diyenler var.

Aslında kaba hatlarıyla D2 durdu. D2, yazılan kitaba bağlıydı ve onunla paralel gitti. Şimdi kitabın yazımı durduğu için D2 de durdu. Küçük düzeltmeler ve eklemeler olabilir ama kabaca bitti.

Aslında bazı insanlar da önce D1 bitsin diyorlar. :) Anladığım kadarıyla onun son tanımı henüz yapılmamış. Üzerinde gelişme olmuyor ama resmi olarak D1 budur diye bir belge yokmuş. :)

Ali
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4508 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli on 2010-02-20, 13:13:
O, alfabe harflerine tamamen kendi belirlediği sıra numaraları vermiş. Örneğin a==0, b==1, vs. Alfabede olmayan bütün karakterler, alfabe harflerinden sonra geliyorlarmış.

Bu fikir aklıma yatmaya başladı. Yazıyla ilgili türlerden bahsettiğimize göre, alfabe karakterlerini en başa almakta bir sakınca olmamalı aslında.

Karşılaştırılan iki karakterden

- ikisi de alfabede varsa, alfabe sırasıyla karşılaştırılırlar
- birisi alfabede yoksa, o sonra demektir
- ikisi de alfabede yoksa, Unicode kodlarıyla karşılaştırılırlar

Bir sakıncası yok herhalde değil mi?

Ali
canalpay (Moderatör) #6
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
- ikisi de alfabede varsa, alfabe sırasıyla karşılaştırılırlar
- birisi alfabede yoksa, o sonra demektir
- ikisi de alfabede yoksa, Unicode kodlarıyla karşılaştırılırlar

Bir sakıncası yok herhalde değil mi?


Aslında daha mantıklı. Ben ascii'nin sıralamasının mantığı anlamıyorum. lfade karakterlerini sıralamasını bıraktım. Zaten Ascii'nin kısaltmasında Amerikan var adam neden ç'yi düşünsün ?

Ama neden ( karakteri alfabeden öncede { karakteri alfabeden sonra. Yada buna benzer yüzlerce örnek. Ben bunun mantığını anlayamadım. Belki kendilerine göre yada benim dahil olmadığım bir gruba göre mantığı vardır.

Bu arada microsoft'un Türkçe imla denetim programından başka zemberek adlı program da var. Bilginize.

Kesinlikle... Ama double değil de long kullanabiliriz. Unicode'dan alınan karakterlerin değerlerini 32 bit (veya başka bir miktar) sola kaydırarak...

Bunu şuan anlamış değilim ama şuna benzetebilirim sanırım. A'nın unicode değeri 01010101 olsa biz bunu iki bit sola kaydırırsak ve son iki bite de dört anlama gelen özellik eklersek(2 bit ile 4 farklı sayı oluşturabilceğimizi sanıyorum.)0101010100 olur. sondaki 00'a bakarız ve 00 en başta anlamına geliyorsa ona göre sıralarken en başa koyarız. Ben bunu varsayıyorum.
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4508 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Bu arada microsoft'un Türkçe imla denetim programından başka zemberek adlı program da var. Bilginize.

Yeni bir Türkçe konusuna dalmak istemiyorum ama Türkçe yazım denetiminin çok zor olduğunu biliyorum. :) Arkadaşıma Zemberek hakkında ne düşündüğünü soracağım.

sondaki 00'a bakarız ve 00 en başta anlamına geliyorsa ona göre sıralarken en başa koyarız.

Doğru. Ama bizim sondaki bitlere ayrıca bakmamıza gerek yok. long karşılaştırması nasıl olsa bakıyor.

Elle bir örnek:

import std.cstream;
 
void main()
{
    int temel_a_sırası = 'a';
 
    göster('a', temel_a_sırası);
 
    long a_sırası = (temel_a_sırası << 2) + 0;
    long â_sırası = (temel_a_sırası << 2) + 1;
    long ǎ_sırası = (temel_a_sırası << 2) + 2;
 
    göster('a', a_sırası);
    göster('â', â_sırası);
    göster('ǎ', ǎ_sırası);
 
    // Doğrudan long karşılaştırmak yetiyor; bitlere bizim dikkat etmemiz
    // gerekmez:
    assert(â_sırası < ǎ_sırası);
}
 
void göster(dchar karakter, long sıra)
{
    // Bu sihirli sabitler ayıp! :) Aslında derleme zamanında
    // hesaplanabilmeliler...
    dout.writefln("%2s %4s %#018x %048b", karakter, sıra, sıra, sıra);
}

Ali
canalpay (Moderatör) #8
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Zemberek ile ilgili olarak :
Sanırım proje sayfası bu        : http://code.google.com/p/zemberek/
Web üzerinden denemek için  : http://zemberek-web.appspot.com/
Bu arada belirteyim web üzerinde çalışanı normal hali gibi iyi çalışmıyor. :-) Yoksa hatırladığım kadarıyla zemberek windowsun yazım denetimi kadar iyi. (Hatta daha iyi :-D )

Ben sadece şimdiye kadar bildiğim bir tane var dediğiniz için demiştim. Ayrıca akıl  akıldan üstündür mantığı ile belki burda değişik bir çözüm bulmuşlardır diye. Yoksa yeni bir Türkçe konusu açmak değil amacım. Bir gün konuşuruz ama o gün hazirandan önce değil :-)

Ayrıca << işleci ne demek bilmiyorum. Sanırım (temel_a_sırası << 2) temel_a_sırası'nın son 2 rakamını döndürüyordur.

bunuda anlamadım "dout.writefln("%2s %4s %#018x %048b", karakter, sıra, sıra, sıra);" ve bu yorumuda     // Bu sihirli sabitler ayıp! :) Aslında derleme zamanında
    // hesaplanabilmeliler...

Sanırım << hariç diğerleri derslerde geçiyordu. Ama ben tam okumadan geçiyordum. Yaz tatilinde tamamen not olarak okuyacağım için. Ama şuan okumamam sorun oluşturuyor. << işlecinide derslere eklerseniz güzel olur herhalde :-)
Bu mesaj canalpay tarafından değiştirildi; zaman: 2010-02-22, 11:05.
acehreli (Moderatör) #9
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4508 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Zemberek ile ilgili olarak

İlk denememi kabul etmedi: "Ayacığı, sanki masacılıktanmışçasına gibi sancılıydı." Zamanla düzelecektir.

Biraz oynadım. Şunu da beğenmiyor: "koşarcasınaymış". Ama beğendim; çok etkileyici. Şunu kabul ediyor: "bardağındakindendir" vs.

Ayrıca << işleci ne demek bilmiyorum.

Biliyorsun: İki bit sola kaydırmak demek. :)

bunuda anlamadım "dout.writefln("%2s %4s %#018x %048b", karakter, sıra, sıra, sıra);"

  http://ddili.org/ders/d/cikti_duzeni.html

ve bu yorumuda     // Bu sihirli sabitler ayıp! :) Aslında derleme zamanında
    // hesaplanabilmeliler...

Onaltılı bir long'un başındaki "0x" ile birlikte sığabilmesi için 18 karakterlik yer ayrılması gerektiğini nereden biliyorum? :) Yani ezbere yazmak yerine, derleme zamanında bir sabitle oluşturabilmeliydim. (string mixin ile olur herhalde ama şimdi zaman ayırmayacağım. :))

Sanırım << hariç diğerleri derslerde geçiyordu.

Şuradaki listede "Bit İşlemleri" dersinde anlatılacak:

  http://ddili.org/ders/d/

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Projeler trileri RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-10-18, 05:55:40 (UTC -07:00)