On Tuesday, 18 March 2014 at 22:42:20 UTC, anonymous wrote:
You can pass the variable name as a string:
Or you can get the variable name from the alias parameter:
import std.string: format;
template gotoPath(alias path) {
enum gotoPath = format(q{
...
fs.chdir(%s);
}, path.stringof);
}
I think I've read that .stringof shouldn't be used for code
generation, but I can't think of anything better.
Your memory seems to be correct:
http://forum.dlang.org/thread/[email protected]/issues/
It looks like the issue is that .stringOf is something generated
according to AST information and is thus intrinsically
compiler-specific. The ticket it links to suggest using
__traits(identifier, X) or 'one of the Phobos helper functions
such as "fullyQualifiedName".'
Annoying that formatting the string is required. I think you're
right that it's ignoring my alias parameter because I'm not using
it. Formatting doesn't accomplish anything except to use the
parameter. But in exchange, you have to relate your format
arguments to the %s entries, instead of the q{} contents just
being code.
import fs = std.file;
import std.stdio;
import std.string: format;
template gotoPath(alias path) {
enum gotoPath = format(q{
string currPath = fs.getcwd();
scope (exit) fs.chdir(currPath);
fs.chdir(%s);
}, __traits(identifier, path));
}
void doStuff(string targetDirectory) {
mixin(gotoPath!(targetDirectory));
writefln("b %s", fs.getcwd());
}
void main() {
writefln("a %s", fs.getcwd());
doStuff("/etc");
writefln("c %s", fs.getcwd());
}