I have a series of functions that each needs to change directory, perform an action, and then revert to the original working directory.

I could put a wrapper around the calls to these functions that performs this action, but I figured a little macro would be sufficient for my needs (it's just a little script.)


import fs = std.file;
import std.stdio;

template gotoPath(alias path) {
    enum gotoPath = q{
        string currPath = fs.getcwd();
        scope (exit) fs.chdir(currPath);
        fs.chdir(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());
}


When I try to compile (DMD 2.064), I get the following error:

test.d(16): Error: undefined identifier path

I can fix the issue by removing the alias parameter and hardcoding the name of the variable in the template:


import fs = std.file;
import std.stdio;

template gotoPath() {
    enum gotoPath = q{
        string currPath = fs.getcwd();
        scope (exit) fs.chdir(currPath);
        fs.chdir(targetDirectory);
    };
}

void doStuff(string targetDirectory) {
    mixin(gotoPath!());
    writefln("b %s", fs.getcwd());
}

void main() {
    writefln("a %s", fs.getcwd());
    doStuff("/etc");
    writefln("c %s", fs.getcwd());
}


However, it seems like that shouldn't be necessary. The alias parameter should create a local alias for the external variable which can be utilized by the generated code. Is there something wrong with my syntax?

Reply via email to