On Thursday, 27 February 2020 at 14:58:20 UTC, Adam D. Ruppe wrote:
On Thursday, 27 February 2020 at 14:32:29 UTC, Petar Kirov [ZombineDev] wrote:
2. Have the new type implicitly convert to printf-style args. I think this is what Adam is proposing. While nice to have, I don't think it's necessary.

You can read my document for more detail

https://github.com/dlang/DIPs/pull/186

But basically

writefln(i"hi $name, you are visitor ${%2d}(count)");

gets turned into:

writefln(
   // the format string is represented by this type
new_type!("hi ", spec(null), ", you are visitor ", spec("%2d"))(),
   // then the referenced arguments are passed as a tuple
   name,
   count
)


So very, very, very similar to Walter's proposal, just instead of the compiler generating the format string as a plain string, the format string is represented by a new type, defined by the spec and implemented by druntime. As a result, no more guess work - it is clear that this is meant to be interpreted as a format string. It is clear which parts are placeholders/specifiers for which arguments.

Perhaps my assumptions were based on an old version of your proposal.

What I want is for:

    auto s = i"hi $name, you are visitor ${%2d}(count)";

to lower to:

    auto s = new_type!(
        "hi ", spec(null), ", you are visitor ", spec("%2d")
    )(name, count);

I.e. the referenced arguments are passed to the constructor of new_type. That way new_type can offer implicit conversion to string, while support for zero-allocation printf, write, writeln, writef, writefln and so on can be done via function overloading.

Reply via email to