Evettz (!) dudak uçuklatacak cinsten, bir Zihni Sinir Proceye hoş geldiniz :)
Aslında anlatacaklarım basit ve Ali hoca ayrıntılı bir şekilde şurada anlatmış ama içinde bir hazine yatıyor, yani alias
' meğer ne biçim bir hazineymiş de (en azından ben) farkında değilmişiz...
Çıkış noktam önce Puneet Goel'in geçen hafta ayın 9'unda başlattığı ve Walter'ın 0bxxxx_xxxx
'li ifadeleri D'den çıkarmak istemesine karşı yaptığı şu itiraz başlığıydı. Alevli tartışmalardan biri olan (an itibariyle 18 sayfa) başlıkta, Dave P. bir kod paylaştı:
https://forum.dlang.org/thread/vphguaninxedxopjkzdk@forum.dlang.org?page=7
(Tam olarak 7. sayfanın sonu)
Aslında konumuz dışı ama çoğunluk, benim de kısmen desteklediğim gibi bu kullanımın kalkmamasını istiyor. Walter ise 0xff_ff
'li hali neyinize yetmiyor, bir yerden sonra kalemin ucuyla sayarsınız diye inat ediyor. Bakalım zaman ne gösterecek, el mi yaman bey mi 😀
Konumuza, paylaşılan kodun (parse işlevini) geliştirdiğim haliyle dönelim ve bunu şimdilik modüller arası bir bölüme kopyalayın:
auto parse(alias E)(string str)
{
ulong result;
foreach(c; str)
{
switch(c)
{
case E.zero:
result <<= 1;
break;
case E.sign: case E.SIGN:
result <<= 1;
result |= 1;
break;
case ' ': case '\r':
case '_': case '\n': case '\t':
continue;
default:
import std.traits : EnumMembers;
import std.format : format;
char[] m = [EnumMembers!E];
auto err = format("TANIMSIZ ÜYE!\nÜYELER: %s", m);
throw new Exception(err);
}
}
return result;
}
Şimdi arkadaşlar, adım adım gidelim çünkü dudaklarınız uçuklamasın :)
Şaka bir yana, lütfen siz parse()
isminde ayrıştırma/çözümleme yapan ve içinde switch/case
'ler ile dolu olan bir Parser'ımız olduğunu hayal edin. Yani şimdilik yukardaki gibi basit bir işlev ve yaptığı ise ASCII 0/1'ler ile ifade edilen (en fazla 64 karakter olmalı) dizgenizi (=string, bence dizgi'den daha güzel) ulong
türünde sayıya çevircek. Yani bu başka bir şey de olabilirdi.
Kodu kısaca, yine alias
'lar (takma adlar) ile şu şekilde test edebilirsiniz. Orijinal koda göre enum
'lar olmazsa işkevimiz çalışmıyor ve doğru karakterleri kullanmazsanız sizi Türkçe uyarıyor ve hangi üyeleri kullanmanız gerektiğini listeliyor:
// import xyz.parser : parse;
import std.stdio;
void main()
{
enum BinToChr : char {
zero = '.',
sign = 'x', SIGN = 'X'
}
alias conNumv1 = parse!BinToChr;
conNumv1(".X.._x.x.").writeln;
// 64 + 12 = 74
enum BinToNum : char {
zero = '0',
sign = '1', SIGN = '|'
}
alias conNumv2 = parse!BinToNum;
conNumv2("0|00_1010").writeln;
// 64 + 12 = 74
auto hata = parse!BinToChr("ha_ta");
}/* ÇIKTISI:
74
74
object.Exception@
aliasTemplateInStruct.d(32): TANIMSIZ ÜYE!
ÜYELER: .xX
----------------
??:? pure @safe ulong source.parse!(source.main().BinToChr).parse(immutable(char)[]) [0x562e10374be5]
??:? _Dmain [0x562e103746ba]
*/
Devamı gelecek inşallah >>