| |
| Posted by dunecourser | PermalinkReply |
|
dunecourser
| D'nin devasa özellik havuzu düşünüldüğünde eklenmelerinin ne kadar etkisi olur pek tahmin edemiyorum ama zaten sorum bununla ilgili değil.
Makrolar, yeni özelliklerin arkaplanda basit bir dilde kullanıcı için çok daha kolay ifade edilmelerine olanak sağlıyorlar. Hijyenik olanlarıysa kontrol edilerek olası hataların önüne geçiliyor.
Biraz düşündüm ve hayali bir dilde birkaç kod satırı yazdım. Sonra onları D'ye uyarladım.
// Dilimizde if blokuna ihtiyacımız yok. Çünkü bu
// makro ihtiyacımızı görüyor.
#if 1 > 0 #then #todo
// Bu kod arkaplanda şu şekilde işlenebilirdi
//
// while (1 > 0) {
// #todo;
// break;
// }
Benzer bir örneği ele alalım.
#for int i = 0, i < 10, i+=1 #then #todo
// #for makrosu bu kodu açıkça şu şekilde ifade
// edebilir.
//
// int i = 0;
// while (i < 10) {
// #todo;
// i+=1;
// }
// Hatta biraz ileri gidip derleyicinin döngü
// optimizasyonlarını kendi elimizle belirtebilirdik.
//
// #optimized_for int i = 0, i < 2, i+=1 {
// #todo;
// }
//
// Bu kod aşağıda şekilde optimize edilebilir.
//
// int i = 0;
// #if i < 2 #then #todo;
// i+=1;
// #if i < 2 #then #todo;
int* p = theAllocator.make!int(32);
// Biz çeşitli durumlarda kullanılacak scope()
// syntaxını kullabiliyoruz ama eğer D'de bu olmasaydı
// dahi D hiyjenik makrolar sayesinde özellik adına
// bir şey kaybetmezdi.
#defer theAllocator.dispose(p);
Hatta öyle ki garbage collector kullanmayan bir durumda şu yaklaşım çok işe yarardı. (Jai'nin struct pointer ownership modelinden alıntıladım.)
// Diyelim ki içinde onlarca pointer bulunan bir
// objemiz var. Bu pointerlerı #owned makrosu ile
// tanımlarsak objenin hemen arkasında serbest
// bırakılacaklarını garanti edebiliriz.
#owner class Obj {
#owned Obj b = null;
#owned Obj e = null;
}
Obj obj = #new Obj();
obj.b = #new Obj();
obj.e = #new Obj()
#delete obj;
// obj.b ve obj.e objenin kendisi ile
// serbest bırakıldı.
Birkaç açıklamasız kodu aşağıya bırakıyorum.
auto std = #access_package "std";
#try fun();
#type "T" sum(T x, T y);
auto n = 0 #as float;
#comptime_run sum(n, n #as int);
#swap a, b, int;
#goto state;
alias this = #this;
Derleyici zamanını artırması dışında D'nin hijyenik makrolar kullanmamasının sebebi nedir, makroların bizim camiamızın düşündüğünün aksine inanılmaz yararlı olabileceklerine inanıyorum açıkçası.
|