August 17, 2021

Merhaba,

Acaba D'de üçlü işleç kullanımı emekliye mi ayrıldı? Çünkü bir işlevin dönüşünde (return) tek satır halinde kullanmak istedim ama başarılı olamadım çünkü her seferinde varsayılan -1 parametresini döndürüyor! Ben de şu şekilde if() ile 2 satırda hallettim :)

import std.conv, std.meta, std.stdio;

template işlevKat(string f, string v) {
  enum sonuç = `return dizi[i][`~v~`]`;
  enum işlevKat = `T `~f~`(size_t i, T n = -1){`
  ~`if(n < 0)`~sonuç~`;`~sonuç~`= n;}`;
}

struct Nokta (T) {
  T[][] dizi;

  /*  x, y, z isminde 3 işlev katar ve bunlar
   *  3'lü her elemana ayrı ayrı erişir...
   *  ( -bknz. Pisagor Üçlüleri )
   */

  static foreach(v, i; AliasSeq!("x", "y", "z"))
    mixin(işlevKat!(i, to!string(v)));
}

Gerçi şablon kafa karıştırabilir, aslında x için derleme zamanında şunu üretiyor:

  T x(size_t i, T n = -1) {
    if(n < 0) return dizi[i][0];
    return dizi[i][0] = n;
  }

Ben ise bunu üretmek istiyorum:

  T x(size_t i, T n = -1) {
    return n < 0 ? dizi[i][0] : dizi[i][0] = n;
  }

Örneği aşağıdaki ana kod ile derlerseniz ne demek istediğimi anlayacaksınız:

void main() {
  int[][] pisagor = [ /* 100'den küçük ilk 16: */
  [ 3, 4, 5],[ 5,12,13],[ 7, 24, 25],[ 8, 15, 17],
  [ 9,40,41],[11,60,61],[12, 35, 37],[13, 84, 85],
  [16,63,65],[20,21,29],[28, 45, 53],[33, 56, 65],
  [36,77,85],[39,80,89],[48, 55, 73],[65, 72, 97]];

  auto integer_sqrt(int i) {
    int x = i;
    int y = (x + 1) >> 1;
    while (y < x) {
      x = y;
      y = (x + i / x) >> 1;
    }
    return x;
  }

  with(Nokta!int(pisagor)) {
    int a, b, c, p = 5;

    foreach(n; 0..dizi.length) {
      p = cast(int)n;
      a = x(p)^^2;
      b = y(p)^^2;
      c = a + b;

      assert(z(p) == integer_sqrt(c));
    }
      writefln("%d² +  %d² = %d", x(p), y(p), c);
      writefln("\t\t\t\t c = %d", z(p));
      x(p, a);
      y(p, b);
      z(p, c);
      pisagor[5].writeln;
  }
}/* ÇIKTISI:
11² +  60² = 3721
   c = 61
[121, 3600, 3721]
*/

Bu arada Dlang okyanusunda sörflüyorken şu makaleye denge geldim; şablonlar ile çok işlevsel bir uygulama yapmışlar:

https://wiki.dlang.org/Using_string_mixins_for_logging

Başarılar...

August 17, 2021

On Tuesday, 17 August 2021 at 13:35:25 UTC, Salih Dincer wrote:

>

Merhaba,

Acaba D'de üçlü işleç kullanımı emekliye mi ayrıldı?

Evet gerçekten de emekliye ayrılmış bir özellik varmış! Warning'leri açınca islevKatma.d-mixin-17(17): Deprecation: "n < 0 ? dizi[i][0] : dizi[i][0]`" must be surrounded by parentheses when next to operator "=" uyarısı ile karşılaştım ve yazıldığı gibi parantezleri ekledim:

  T x(size_t i, T n = -1) {
    return n < 0 ? dizi[i][0] : (dizi[i][0] = n);
  }