On Monday, 8 February 2016 at 13:37:19 UTC, Andrei Alexandrescu wrote:
On 2/7/16 7:11 PM, John Colvin wrote:
alias dump = dumpTo!stdout;
alias errDump = dumpTo!stderr;

I'm hoping for something with a simpler syntax, a la dump!(stdout, "x") where stdout is optional. -- Andrei

This works:

---

import std.stdio : File;
static import std.ascii;

template dump(symbols...)
{
        import std.stdio : File;

        void dump(Separator, Terminator)(
                File file,
                Separator separator = ", ",
                Terminator terminator = std.ascii.newline)
        {
                foreach(i, symbol; symbols[0 .. $ - 1])
file.write(__traits(identifier, symbols[i]), " = ", symbol, separator); file.write(__traits(identifier, symbols[$ - 1]), " = ", symbols[$ - 1], terminator);
        }

        void dump(Separator, Terminator)(
                Separator separator = ", ",
                Terminator terminator = std.ascii.newline)
                if (!is(Separator == File))
        {
                import std.stdio : stdout;
                .dump!symbols(stdout, separator, terminator);
        }
}

void main()
{
        import std.stdio : stdout;

        int a = 42;
        string b = "foo";
        float c = 3.14;

        dump!(a, b, c)(); // a = 42, b = foo, c = 3.14
        stdout.dump!(a, b, c)(" | "); // a = 42 | b = foo | c = 3.14
}

---

I'm not a fan of non-trivial string mixins except in extenuating circumstances. I tried compressing it to a single call to `write` like your `print` except using staticMap, but like I often do I ran into "template instance foo cannot use local 'bar' as parameter to non-global template baz" errors.

Reply via email to