Just because it's a slow Thursday on this forum

Jakob Ovrum via Digitalmars-d digitalmars-d at puremagic.com
Tue Feb 9 04:46:34 PST 2016


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.


More information about the Digitalmars-d mailing list