July 24, 2021

Merhaba,

Bir süredir Ali Çehreli'nin kütüphanesindeki şu modüllerde okuma yapıyordum:

https://bitbucket.org/acehreli/alphabet/src/master/tr/

tr.alphabet.dizgi'deki Dizgi kurulurken stride() kullanılmış ve anlaşılan, double char biçiminde gelen veri char(0) veya char(1) olabilecek karakter kod kümelerini atlayarak aktarmak amaçlanmış. İşte şurası:

https://bitbucket.org/acehreli/alphabet/src/master/tr/dizgi.d#lines-47

tr.alphabet.im'e baktığımızda da (zaten Dizgi içinde bu yapı var) dchar karakter_ kullanıldığını görüyoruz. Yani stride() kullanılarak yapılan aktarma işlemini kaldırmak mantıklı olabilir mi? İşte şurası:

https://bitbucket.org/acehreli/alphabet/src/master/tr/im.d#lines-26

tr.alphabet.dizgi'deki Dilim yapısına baktığımızda (geçi bunu Ali hoca onayladı ve hatayı bu güncelleme düzeltiyor) ekstra bir güncelleme gerekiyordu. Bahsettiğim satır length + 1 olması yeterli. İşte şurası:

https://bitbucket.org/acehreli/alphabet/src/master/tr/dizgi.d#lines-562

Gerçi dilimlerle ilgili başka sorunlar da var ama okumayı bitirdikçe ilgili düzeltmeleri veya sorularımı burada paylaşacağım. Özet geçmek gerekirse:

1a. if (isNarrowString!T) ile şarta bağlanan kurulumda neden stride() kullanıldı?
1b. Gerekiyorsa neden İm yapısında char karakter_; kullanılmadı?

2a. Dilim yoluyla karakterlere ulaşırken son karaktere ulaşamama sorunu düzeltildi.
2b. Ayrıca dilimlenen Dizgi'yi basitçe ekrana yansıtmak mümkün mü?

Teşekkürler...

July 24, 2021
On 7/24/21 9:05 AM, Salih Dincer wrote:

> tr.alphabet.dizgi'deki Dizgi kurulurken stride() kullanılmış ve
> anlaşılan, double char biçiminde gelen veri char(0) veya char(1)
> olabilecek karakter kod kümelerini atlayarak aktarmak amaçlanmış. İşte
> şurası:
>
> https://bitbucket.org/acehreli/alphabet/src/master/tr/dizgi.d#lines-47
>
> tr.alphabet.im'e baktığımızda da (zaten Dizgi içinde bu yapı var) dchar
> karakter_ kullanıldığını görüyoruz.

Bu kodları D ile ilk tanıştığım zamanlarda deneysel olarak yazdığımdan şimdiki aklımla yeniden yazsam herhald çok farklı yazardım.

Örneğin, artık gerçekleştirmede dchar kullanılmasının doğru olduğunu düşünmüyorum. dchar, karakterlere dizgi[0] gibi rastgele erişirken kolaylık sağlarmış gibi görünse de aslında sağlayamaz.

Çünkü bir dchar dizgisi bir "unicode code point" dizgisidir ama code point, anladığımız anlamda harfe karşılık gelmez. (Bakınız grapheme ve grapheme cluster.)

Örneğin, "çam" sözcüğü 3 dchar'dan da oluşabilir (ç, a, ve m), 4 dchar'dan da oluşabilir (c, "combining cedilla", a ve m).

O yüzden, dchar dizgisinin indekslenebileceği bir yanılgıdır.

O yüzden, bugünkü kafamla gerçeklemede yine de char dizgisi kullanırdım çünkü zaten harfleri rastgele indekslemek pek de sık karşılaşılan bir işlem değildir. Örneğin, büyük harfe çevirirken bile "şu indeksteki harfi büyüğüne çevir ve bunu .length adet harf için tamamla" demeyiz "baştan sona kadar bütün harfleri büyük harfe çevir" deriz. Bunlardan birincisi RandomAccessRange gerektirir, ikincisi ise InputRange. Yani, InputRange harflerle işlerken de yeterlidir.

> Yani stride() kullanılarak yapılan
> aktarma işlemini kaldırmak mantıklı olabilir mi? İşte şurası:
>
> https://bitbucket.org/acehreli/alphabet/src/master/tr/im.d#lines-26

Evet, mantıklı olur.

> ilgili düzeltmeleri veya sorularımı burada paylaşacağım

Farklı konu başlıkları açarak lütfen... ;) Programcılık gibi: Küçük küçük çok sayıda işlev, çok uzun tek işlevden her zaman daha iyidir. :)

Ali