Thread overview
D Neden Hijyenik Makro Kullanmıyor?
Dec 18, 2022
dunecourser
Dec 18, 2022
Salih Dincer
Dec 18, 2022
Ali Çehreli
Dec 18, 2022
Ali Çehreli
December 18, 2022
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ı.
December 18, 2022

On Sunday, 18 December 2022 at 05:43:25 UTC, dunecourser wrote:

>

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;
//    }

Bu örneğe benzer bir döngü örneği var diye hatırlıyorum. Evet, şu sayfada 8. maddeye bakın. Gelen sayfada görüleceği üzere Şablon Katmaları (Template Mixin) bildiğimiz makro gibi çalışabilmekte.

Başarılar...

Dip Not: Yukardaki örnekte todo yerine alias fun almış.

December 18, 2022
On 12/17/22 21:43, dunecourser wrote:

> Derleyici zamanını artırması dışında D'nin hijyenik makrolar
> kullanmamasının sebebi nedir,

Tahminen dili tasarlayanın aklına gelmemiştir (veya bilmiyordur :) ). Makroların C'de ve C++'ta nasıl zararlı görüldüklerini biliyoruz. (Sen de o yüzden "hygenic" olanlarından bahsediyorsun. :) ) Walter bütünüyle kurtulma yolunu seçmiş ama hygenic macro da olabilirmiş, evet.

"Hygenic" sözü, "string mixin" olanağı sayfasında geçiyor:

  https://dlang.org/articles/mixin.html

Hem o olanak hem de Salih'in gösterdiği "template mixin" olanağı öne çıkmış.

Bu arada, tam aradığımızı karşılamıyor ama gösterdiğin kodların bazılarını derleyici arka planda "lowering" olarak yapar.

> makroların bizim camiamızın düşündüğünün
> aksine inanılmaz yararlı olabileceklerine inanıyorum açıkçası.

Olabilir.

Ali

December 18, 2022
On 12/17/22 21:43, dunecourser wrote:

>      #if 1 > 0 #then #todo
>      // Bu kod arkaplanda şu şekilde işlenebilirdi
>      //
>      //    while (1 > 0) {
>      //        #todo;
>      //        break;
>      //    }

Ucundan ilgili olarak, Walter'ın DConf Online 2022 sunumu "syntactic sugar" üzerine (ve şu anda):

  https://www.youtube.com/watch?v=RO7IJvxtwjQ

Ali