Türkiye'de 2'lerden birini (2022 -> 3) uğurlamaya saatlerin kaldığı şu dakikalarda! 😀
Rikki'nin (sanırım takma ismi) yabancı forumda işaret ettiği noktaya takıldım; aslında katılım sağlayanlarla birlikte yol aldık ama sanırım hala anlamadığım kısımları var...
Her şey "karışık" (mixed) string türünden uzaklaştığım ve onun değiştirilebilir olmasını istediğim anda başladı:
string Chars = "YILBAŞI";
dchar[] Darr = (cast(dchar[])Chars).dup;
Chars.length.writeln(": ", Chars.ptr); // 8: 55E1416BDD60
Darr.length.writeln(": ", Darr.ptr); // 2: 7FE3FF356000
Görüldüğü gibi, başta dönüşüm için herhangi bir kütüphaneden değil typeof()
gibi iç dil olanağı olan cast()
'den faydalandım. Eee ne var bunda demeyin; The Ghost Rider (Hayalet Sürücü) filminin sonlarına gönderme yapmalıyım. İşte makale fikrinin filizlendiği o replik:
"You change, She dies..."
(Dönüşürsen, kız ölür!)
Evet, fark ettiyseniz 8 karakterli kızımız (Chars) bir bakmışsınız 2 karakterli bir şeye benzemeyen hale dönüşmüş. Açıklaması basit ve bu konuda cast()
'in bir suçu yok:
Bir dchar
, 4 çeker bir Jeep (32 bit) olduğundan her UTF karakter temsil edilebiliyor. Chars için özel opCast()
tanımlamadığımız için de 2 x 4 tekerin her birine tek harf (Ş harfi 2 teker!) yerleşiyor. Ancak bize kullanılmasa bile dchar[7] lazım çünkü örneğimizde 7 harfimiz var.
Eğer std.conv'deki to!(dchar[])
kullanılmazsa şu şekilde aptalca düzeltebilirdik:
import std.stdio;
char[28] YILBAŞI = 0;
void main()
{
string Chars = "YILBAŞI";
foreach(i, Char; Chars[0..5]) {
YILBAŞI[i * 4] = Char;
}
char[2] fixŞ = [ 0x5E, 0x01 ];
YILBAŞI[20..22] = fixŞ;
YILBAŞI[24] = 'I';
writeln(cast(dchar[])YILBAŞI); // YILBAŞI
Chars.print;
}
Tam olarak fixŞ'ye niye ihtiyaç olduğunu bilmesem de kodlama farklılığından dolayı olduğunu düşünüyorum. Çünkü Ş harfi string içindeyken şöyle:
>0xC5-0x9E
Herhalde ASCII ile UTF ayrımı yapılabilmesi için belli bir mantığa göre tertiplenmiş olmalı. O yüzden string için "karışık" (mixed) diyorum ya!
(Şimdilik bu kadar, yazacak daha çok şey var! Örneğin stack-heap ve/veya string literal olayı...)