On 07/31/2017 05:43 PM, Martin Tschierschke wrote:
As a rookie in D programming I try to understand the power of templated functions with compile time parameters. With DMD 2.074 a compile time format
(auto output = format!("Print this %s")(var);)

was introduced, now we all know that very many of this format strings are immutable, so wouldn't it be cool to automatically detect this and use the compile time version?

Without the need to think about it and to use an other syntax?
Is this theoretically possible?

Kinda-sorta, but not really and you have to use the template syntax:

----
string format(alias fmt, A ...)(A args)
{
    import std.format: sformat = format;
    static if (__traits(compiles, { enum e = fmt; }))
        return sformat!("(CT) " ~ fmt)(args);
    else
        return sformat("(RT) " ~ fmt, args);
}

void main()
{
    import std.stdio: readln, writeln;

    // CT
    writeln(format!"Print this %s"(42));

    // RT
    auto fmt = readln();
    writeln(format!fmt(42));
    // Can't call it like this: format!(readln())(42);

    // also still RT
    auto fmt2 = "Print this %s";
    writeln(format!fmt2(42));

    // (somewhat surprisingly) CT
    immutable fmt3 = "Print this %s";
    writeln(format!fmt3(42));
}
----

Reply via email to