Forum: D Programlama Dili RSS
Büyük küçük harf dönüşümü
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Büyük küçük harf dönüşümü
Bu konu sıklıkla karşımıza çıktığı ve D'nin yamalı bohça gibi olan taraflarından bir tanesi olduğu için ayrı bir konu başlığı olarak açıyorum.

Bu konuyu 7 sene önce de konuşmuşuz.  Hala düzelmemiş mi :huh:

Acaba dstring için yaptığımız büyük küçük harf dönüşümü string türü için nasıl yapabiliriz?

import std.stdio;
import std.uni;
 
 
void main()
{
    dstring metin = "Arduino başlangıç";
    writeln(büyükHarf(metin));
}
 
dstring küçükHarf (dstring metin)
{
    dstring dönen;
 
    foreach (i, dchar harf; metin)
    {
        harf = metin[i];
        dönen ~= küçükHarf(harf);
    }
    return dönen;
}
 
dchar küçükHarf(in dchar karakter)
{
    return (karakter == 'I') ? 'ı' : toLower(karakter);
}
 
dstring büyükHarf (dstring metin)
{
    dstring dönen;
 
    foreach (i, dchar harf; metin)
    {
        harf = metin[i];
        dönen ~= büyükHarf(harf);
    }
    return dönen;
}
 
dchar büyükHarf(in dchar karakter)
{
    return (karakter == 'i') ? 'İ' : toUpper(karakter);
}
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4412 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Şablon yapınca ve dizgiyi aralık olarak kullanınca her tür dizgiyle işleyebiliyor:
import std.stdio;
import std.uni;
import std.traits: isSomeString;
import std.algorithm: map;
 
void main()
{
    string metin = "Arduino başlangıç";
    writeln(büyükHarf(metin));
    writeln(küçükHarf(metin));
}
 
auto küçükHarf (S)(S metin) if (isSomeString!S)
{
    return metin[].map!(h => küçükHarf(h));
}
 
dchar küçükHarf(in dchar karakter)
{
    return (karakter == 'I') ? 'ı' : toLower(karakter);
}
 
auto büyükHarf (S)(S metin) if (isSomeString!S)
{
    return metin[].map!(h => büyükHarf(h));
}
 
dchar büyükHarf(in dchar karakter)
{
    return (karakter == 'i') ? 'İ' : toUpper(karakter);
}
Ali
zafer #3
Üye Tem 2009 tarihinden beri · 694 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Vay be 7 sene önce. Zaman ne kadar hızlı geçmiş. Maden eski defterleri karıştırıyorsunuz. trileri isimli bir proje vardı. Türkçe i harfi ile arama ve sıralama işlemleri içindi diye hatırlıyorum. Onu dub deposuna (https://code.dlang.org) ekleme imkanımız olur mu? Sanırım ona ihtiyacım olacak  :-D
https://github.com/zafer06 - depo
erdem (Moderatör) #4
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ali bey teşekkürler.

Zafer ben geçenlerde bu konuyla ilgili iletilere bakarken rastgelmiştim.

https://bitbucket.org/acehreli/alphabet
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4412 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Erdem, o proje fazla deneysel ve artık derlenebildiğinden bile emin değilim. Ondan çok daha az kapsamlı bir sıralama ve küçük/büyük harfe dönüştürme modülünü ddili.org projesinde kullanıyorum:

  https://bitbucket.org/acehreli/ddili/src/45c2ecc…?at=mas…

Gördüğüm kadarıyla ddili.org projesinden bağımsız bir modül değil çünkü içinde indexSectionOrder gibi kitapla ilgili işlevler de var. Aslında indexSectionOrder başka yerlerde de kullanışlı olabilir çünkü örneğin "UTF-8" gibi bir dizginin "UTF-32" gibi bir dizgiden daha önce sıralanması gerektiğini biliyor. (Yoksa, '3' karakteri '8' karakterinden önce olduğundan normalde "UTF-32" öne gelirdi.) Ayrıca, kitap dizini doğru olsun diye örneğin "-inline" dizgisi ile "inline" dizgisini aynı yere koyuyor. (Yoksa, '-' karakteri nedeniyle bambaşka bir yere düşerdi.)

Umarım kullanışlı olur.

Ali
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4412 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Pek de kullanışsızmış ama olsun... Örneğin, dizgi alan toUpper bile yok. :)
import alphabet;
import std.algorithm: map, equal;
 
unittest {
    auto alfabe = makeAlphabet("turkish");
 
    assert(alfabe.is_less("şiir", "zehir")); // normalde ş z'den sonradır
    assert("aâbcçdefgğhıîijklmnoöpqrsştuûüvwxyz".map!(h => alfabe.toUpper(h)).equal
           ("AÂBCÇDEFGĞHIÎİJKLMNOÖPQRSŞTUÛÜVWXYZ"));
 
    assert(alfabe.is_less("kâğıt", "kedi"));
    assert(alfabe.is_less("UTF-8", "UTF-32"));
}
 
void main() {
}
Ali
erdem (Moderatör) #7
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ali bey çok teşekkürler! :)

Bu arada siz sadece D mi kodluyorsunuz merak ettim. Demek istediğim çalıştığınız yerde projelerde de mi D kullanıyorsunuz.

D kullanan firma sayısı artmaya başladı mı?
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4412 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
İnanılır gibi değil ama Haziran'dan beri çalıştığım Weka.IO'da yalnızca D kodluyorum. Gerçek hayatta kullanmak çok daha eğitici oluyor. ;) D kullananların sayısı yavaş yavaş artıyor:

  http://dlang.org/orgs-using-d.html
  http://dlang.org/areas-of-d-usage.html

Ali
erdem (Moderatör) #9
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
acehreli:
Şablon yapınca ve dizgiyi aralık olarak kullanınca her tür dizgiyle işleyebiliyor:
auto küçükHarf (S)(S metin) if (isSomeString!S)
{
    return metin[].map!(h => küçükHarf(h));
}
 
dchar küçükHarf(in dchar karakter)
{
    return (karakter == 'I') ? 'ı' : toLower(karakter);
}

Peki Ali bey bu değeri kullanmak istersek.

    auto kütükİsmi = küçükHarf(sayfaBaşlığı);
    string dosyaAdı =  kütükİsmi ~ ".html";

Burada  Error: incompatible types for ((kütükİsmi) ~ (".html")): 'MapResult!(__lambda2, string)' and  'string'

şeklinde bir hata alıyorum.
zafer #10
Üye Tem 2009 tarihinden beri · 694 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #8
Sanırım benimde işimi görür, Teşekkürler.
https://github.com/zafer06 - depo
acehreli (Moderatör) #11
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4412 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Erdem, bu gibi ifadelerin tembel olduklarını biliyorsun: Ne işlem yapılacağını biliyorlar ama henüz hiçbir işlem yapmıyorlar. Yani, oradaki küçükHarf işlevleri tembel ifade döndürüyorlar. O ifadeleri değermişler gibi kullanamayız, ama aralıkmışlar gibi ilerletebiliriz.

Aralık gibi ilerletmeyi empty, front, ve popFront ile kendimiz yapabileceğimiz gibi, onları arka planda çağıran algoritmalar kullanabiliriz. Örneğin, küçükHarf'in döndürdüğü ifadeyi doğrudan writeln'a verebiliriz. writeln da elemanları teker teker çekerken tembel işlemlerin sonuçlarını görmeye başlar.

Dolayısıyla, ".html" gibi başka bir ifadeyle birlikte kullanabilmek için önce sonucu oluşturmak gerekiyor. Bunun bir yolu, tembel ifadenin sonuna .text algoritmasını eklemektir. std.conv.text, to!string'in biraz daha kullanışlısı: bütün parametrelerini string'e dönüştürür.
    import std.conv: text;
    string dosyaAdı =  kütükİsmi.text ~ ".html";
Ama hazır .text'i kullanmaya başlamışken, ~ işlevine de bulaşmamış oluruz. (DConf konuşmacılarından birisi ~ karakterinin yavaş anlamına geldiğini söylemişti. :) )
    string dosyaAdı =  text(kütükİsmi, ".html");
Bazı durumlarda biraz daha geliştirebiliriz: text'in oluşturduğu sonuç kısa olduğu sürece bir sorun yoktur. Ama sonuç çok uzun olduğunda çok bellek gerekecektir. Eğer sonuç örneğin yalnızca çıktıya yazdırılacaksa, yani karakterler geçici olarak kullanılacaklarsa, sonucu büyük bir bellek bölgesine dizi olarak yerleştirmeye gerek olmamalıdır. Böyle bir durumda birden fazla aralığı tek aralık gibi kullanmayı sağlayan chain'den yararlanabiliriz:
    import std.range: chain;
    auto dosyaAdı =  chain(kütükİsmi, ".html");
Ama yine başa döndük: Elimizde dizi değil, sonucu oluşturacak bir tembel ifade var. Gerekirse .array ile diziye dönüştürürüz, gerekmezse tembel ifadeden kullanırız. Örneğin, çıktıya göndeririz:
    import std.range: chain;
    auto dosyaAdı =  chain(kütükİsmi, ".html");
    writeln(dosyaAdı);
Tekrar etmek gerekirse, bu son sonucun değeri, sonuç için bellek ayırmaması, karakterleri tembel olarak oluşturmasıdır. Tabii, bu söylediklerimin bu kadar küçük dizgilerde hiç önemi yok. Bilinse iyi olur. :)
Ali
erdem (Moderatör) #12
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler! :) Sanırım şimdi anlamaya başladım.
erdem (Moderatör) #13
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Peki ilkHarfBüyük işlevini nasıl yapabilirdik?

Ben şöyle bir çözüm düşündüm ama cihanşümül değişkenlerden faydalanıyor.

auto ilkHarfBüyük(S) (S metin) if (isSomeString!S)
{
    return text(metin[].map!(h => ilkHarfBüyük(h)));
}
 
bool ilkkez = true;
 
dchar ilkHarfBüyük(in dchar karakter)
{
    if (ilkkez)
    {
        ilkkez = false;
        return büyükHarf(karakter);
    }
    return küçükHarf(karakter);
}

ilkkez değişkenini kullanmadan sadece ilk sefere mahsus başka bir işlevi çağırmanın başka yolu var mı acaba?
acehreli (Moderatör) #14
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4412 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Evrensel değişken kesinlikle olmaz tabii. :) Yeni dizgiye başladığımızdan haberi olamaz. Ben şöyle bir şeyle mutlu olurdum:
auto ilkHarfBüyük(S) (S metin) if (isSomeString!S)
{
    import std.array: front, empty, popFront;
    import std.range: only, chain;
 
    assert(!metin.empty);
 
    auto başı = metin.front.büyükHarf.only;
    metin.popFront();
    auto gerisi = metin.küçükHarf;
    return chain(başı, gerisi);
}
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:
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-06-25, 19:09:16 (UTC -07:00)