10 hours ago

Merhaba,

İlk Ali hocamdan gördüğüm ve sonra Rust'daki assert_eq!() şablonundan etkilendiğim bir assert sarması yaptım; basit bi'şi:

Topu topu 3-4 if (ikisi static) ve bir label(_error_)'dan ibaret. Ama ne yalan söyleyeyim standart assert artık yetmiyor, kolaylık istiyor insan. Geliştirme önerisi olan? İşte kod:

import std.stdio;

enum stringTest = "oldu mu?";

void main()
{
  auto a = [1, 2];
  auto b = [1, 2, 3];

  // 1.no error:
  if (a.equal!""(b))
  {
	goto _devam_;

  } else
  {
	writeln("Diziler eşit değil!");
	return;
  }

  _devam_:
  writeln("Short ile devam...");

  Short foo = { 21 };
        foo *= -1;
        foo = foo * -2;

  // 2. standart assert:
  assert(foo.s == 42);
  foo.s.equal(42);

  // 3. custom error:
  string foos;// = stringTest;
  foos.equal!"olmadı"(stringTest);
}

// Ali hocanın şeker sarması:
void assertEqual(A, B)(in A a, in B b, string file = _FILE, size_t line = __LINE_)
{
  import std.format : format;
  assert(a == b, format("ERROR: Expressions are not equal.\n%s:%s:    %s != %s",
                        file, line, a, b));
}

// Salih'in yaptığı yaprak sarması :)
alias equal = assert_eq;
template assert_eq(string hata = "hata", R)
{
  enum pred = "a != b"; // "a == b"

  bool assert_eq(in R p, in R q)
  {
    static if (imported!"std.range".hasLength!R)
    {
	  import std.algorithm : eşit_değilse = equal;
      if (p.eşit_değilse!pred(q))
		goto _error_;
	}	
	
	if (p != q)
	  _error_:
	
	static if (hata.length)
      assert(0, hata);
    else
      return 0;

    return 1;
  }
}

struct Short
{
  short s;

  auto opBinary(string op: "*")(int rhs)
  {
    auto result = s * rhs;
    return Short(cast(short)result);
  }

  void opOpAssign(string op: "*")(int rhs)
  {
    s *= rhs;
  }
}

SDB@79