March 28, 2023

Merhaba,

Aşağıdaki kod Walter'dan:
(Kaynak: https://github.com/dlang/dconf.org/blob/master/2022/slides/bright.pdf 31. Sayfa: The New Way)

import std.algorithm;
import std.range;
import std.stdio;

enum
{
  veri = "helloooo".dup, // [ 0, 1, 1, 1, 2, 3 ],
  tekli = veri.uniq,
  tekrar = 3,
  N = tekli.walkLength * tekrar
}

void main()
{
  alias type = typeof(veri[0]);
  type[N] arr =
  {
    type[N] arr;
    size_t sayaç;

    tekli.map!(r =>
      r.repeat(tekrar)).joiner.each!(a =>
        arr[sayaç++] = cast(type)a);
    return arr;
  }();
//  ^-- genelde unutulduğundan çok önemli!
  typeid(arr).writeln(": ", arr);

} /* ÇIKTISI:
  char[12]:hhheeelllooo
*/

Aslında biraz değiştirdim ve Ali hocanın denkTekrarlı() işlevini uyarladım. Burada vurgulanması gereken CTFE tarafı, yani bu statik dizi derleme anında oluşturulmakta. Bu ne demek?

Sizin veriniz (sampleData) test esnasına geçilmeden hazır hale getirildi bile. Yani t0 anında tıpkı bir enum tanımlar gibi o veri işlenmiş oldu. Daha da ötesi, ekleme yapıp sınırları geçmediğiniz müddetçe değiştirilebilir. Tabi istediğiniz anda GC'ye emanet edebileceğiniz bir dinamik dizi haline de dönüştürülebilir veya bu tür hazır lambda işlevleri global alana (modül seviyesine) alarak çalışma anında da işlev görmesini sağlayabilirsiniz.

Başarılar...