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