On Friday, 12 May 2017 at 08:47:32 UTC, visitor wrote:
works for me :
mixin template testBoilerPlate(alias arg, alias expected)
{
    auto doit = {
        import std.format : format;
        auto got = compute(arg);
assert(got == expected, "expected %s got %s".format(expected, got));
        return true;
    }();
}

nice hack, or should I say idiom? I definitely didn't think of that one, I though of using a parameterized function which kinda similar. but this isn't what I'm looking for.I just want to do C style macro expansion. no function/lambda call at runtime, even if the optimizer inlines the lambda's. I can do this with plain mixin, but it's uglier.

example with mixin:
//-----------------------
string testBoilerPlate(alias arg, alias expected)()
{
    import std.format : format;

    return q{
        {
            import std.format : format;
            auto got = compute(%1$s);
assert(%2$s == got, "expected %%s, got %%s".format(%2$s, got));
        }
    }.format(arg.stringof, expected.stringof);
}

unittest
{
    mixin(testBoilerPate!("000", 1));
}
//-----------------------

Reply via email to