January 14, 2023

Bugün size çok akıllıca bir çözümü paylaşmak istiyorum...

Öyle ki hani akıllı telefonlar (smart phone) çıktığında diğerlerinin (feature phone) pabucu dama atıldı ya öyle bir şey:

https://forum.dlang.org/post/tps2hl$14k1$1@digitalmars.com

Hayır, daha da öte! Basit ama çok akıllıca ve bu yüzden Ali hocaya özel olarak teşekkür etmeliyim! Kod şu:

mixin template Helper()
{
  import std.stdio : writefln;

  auto noRun = run(); // no error but deceptive print
  string msg = "bad";
  //auto Run = run(); // feasible print
  
  auto run()
  {
    msg.writefln!"(%s)";
    return 41;
  }
}

void main()
{
  // assert(noRun == 41); /*no compile, Error:
  //                      undefined identifier
  mixin Helper help;
  // optional ---^
  assert(noRun == 41);

  help.msg = `"have nice day!"`;
  help.msg.writefln!"%s == %s"(msg);



  /// KOD PATLAMASIN DİYE DOLDURMA \\\
  struct S { align(2) int i; }
  auto s = S(int.max);
  //writefln("%s", s);
  /// KOD PATLAMASIN DİYE DOLDURMA \\\
}

Yukardaki kod, normalde noRun() dahil değilken çalıştırmalı çünkü hatalı ve derleyici msg dizgesine ulaşamadığından çalılmayabilir ama derlenir. Özellikle DMD'de şöyle çalışır:

>

()
"have nice day!" == "have nice day!"

Ama LDC'de çalışmıyor bile o yüzden gizlenen auto Run satırını açıp olması gereken üzerinden devam edeceğiz. Görüldüğü gibi bu bir şablon katması ve ilgili modülü eklediği gibi bir işlev (run) ile iki değişken (biri msg dizgesi) de kod dahil edilir (mixin/katma) katılır.

Bu kullanımı Ali hocadan öğrendik. Bu sayede katma derleme zamanında koda dahil edilir ve çalışma anında ilgişi işlev çalıştırılır çünkü Run değişkeni bir dönüş değeri almak zorundadır. Çok neciz ve akıllıca değil mi?

Farkettiyseniz, rezerve edilen anahtar sözcükler hariç herhangi bir kelime olabilir. Hatta mixin'e özel bir isim vermeye gerek yok. Çünkü string msg zaten orada, koda dahil. Alınması gereken çıktı ise şöyle:

>

(bad)
"have nice day!" == "have nice day!"

Başarılar...

January 16, 2023
On 1/14/23 11:58, Salih Dincer wrote:

> Ali hocaya özel olarak teşekkür etmeliyim!

O yöntemin bana ait olmadığını hatırlatmak istiyorum. Ben daha önce Learn forumunda görmüştüm. Ve az önce buldum:

  https://forum.dlang.org/post/pvdoq2$1e7t$3@digitalmars.com

Ali