D başından beri C ve C++'taki o gibi konulara bir tepki olarak tasarlandığından çok daha az var. Hemen aklıma gelen iki tanesi:
Temel türler arasında otomatik tür dönüşümleri (C ve C++'tan çok daha güvenli ama yine de bu kurallar C'den alınmış):
import std.stdio;
void main() {
int[] dizi;
int a = -42;
writefln!"dizi uzunluğu: %s"(dizi.length);
writefln!"a: %s"(a);
writefln!"İkisinin toplamı: %s"(dizi.length + a);
}
Çıktısı:
'
dizi uzunluğu: 0
a: -42
İkisinin toplamı: 18446744073709551574
'
Nasıl yani? :p
Başka bir tanesi de yerel sabit uzunluklu dizi dilimi döndürülebiliyor:
// Masum bir islev
auto ilkYarısı(int[] dizi) {
return dizi[0 .. $ / 2];
}
auto foo() {
int[10] dizi;
// Farkında olmadan yerel dizi'nin ilk yarısını döndürüyor:
return ilkYarısı(dizi);
}
void main() {
// Geçersiz elemanları kullanmak üzere:
auto a = foo();
}
O da göreceli olarak yeni bir D olanağı ile çözülebiliyor: ilkYarısı'nın parametresinin başına 'return' yazarsanız, derleyici foo()'daki hatalı durumu yakalıyor:
auto ilkYarısı(return int[] dizi) {
// ...
}
Başka bir sorun, belirsiz sayıda parametre alan bazı işlevlerde görülüyor:
import std.stdio;
int[] dizi;
// Belirsiz sayıda int alıyor:
auto foo(int[] parametreler...) {
writefln!"parametreler.ptr: %s"(parametreler.ptr);
dizi = parametreler;
}
void main() {
// Bu parametrelerden geçici bir dizi oluşturulur:
foo(1, 2, 3);
// O dizi bu noktada geçersiz hale gelmiştir.
// Ama modül düzeyindeki dizi hâlâ onun elemanlarını gösteriyor:
writefln!"dizi.ptr: %s"(dizi.ptr);
}
'
parametreler.ptr: 7FFDB57563F0
dizi.ptr: 7FFDB57563F0 <-- Artık orada bir dizi yok :(
'
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]