| |
| Posted by Ali Çehreli (acehreli) in reply to cos00kun | PermalinkReply |
|
Ali Çehreli (acehreli)
Posted in reply to cos00kun
| Biraz olgunlaştırdım:
import std.stdio;
import std.conv;
import std.string;
import std.algorithm;
immutable işlemler = [ "+", "-", "*", "/" ];
// Diziye kendi türünden eleman ekler
void ekle(T)(ref T[] dizi, T değer) {
dizi ~= değer;
}
// Diziye string'den dönüştürdüğü eleman ekler.
// `değer` T'ye dönüştürülemiyorsa ConvException atar
void ekle(T)(ref T[] dizi, string değer) {
dizi ~= değer.to!T;
}
// Diziden eleman çıkartır. Dizinin başka dilimi
// olmadığını varsayarak çıkartılan elemanların
// yerlerini daha sonradan eklenen elemanlar için kullanır.
void kısalt(T)(ref T[] dizi, size_t adet) {
dizi.length -= adet;
dizi.assumeSafeAppend();
}
// Yığıtın içeriğini yazdırır. Gittikçe azalan ve en sonunda
// yok olan etiketler kullanır.
void bildir(T)(const T[] yığıt) {
static size_t adet = 0;
enum etiketler = [ "Yığıt", "y", "" ];
const etiket = etiketler[min(etiketler.length - 1, adet)];
writefln("%s:%( %s%)", etiket, yığıt);
++adet;
}
void kullanım() {
writefln(
"Kullanım:
sayı : Yığıta ekler
%-(%s %) : Yığıttaki son iki değerle işlem yapar; sonucu yığıta ekler
sil : Son değeri yığıttan çıkartır
", işlemler);
}
void main() {
kullanım();
double[] yığıt;
void işle(string satır) {
switchBaşı:
switch (satır) {
static foreach (işlem; işlemler) {
case işlem:
if (yığıt.length < 2) {
writefln(`HATA: Yığıtta "%s" işlemi için yeterli değer yok`, işlem);
} else {
auto değer = mixin(format("yığıt[$-2] %s yığıt[$-1]", işlem));
yığıt.kısalt(2);
yığıt.ekle(değer);
}
break switchBaşı;
} // static foreach
case "sil":
if (!yığıt.empty) {
yığıt.kısalt(1);
}
break;
default:
try {
yığıt.ekle(satır);
}
catch (ConvException hata) {
writefln(`HATA: Sayı, işlem, veya "sil" değil: "%s"`, satır);
}
break;
} // switch
yığıt.bildir();
}
stdin
.byLine
.map!strip
.filter!(satır => !satır.empty)
.map!(satır => satır.text)
.each!işle;
}
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
|