On Wednesday, 13 March 2013 at 20:26:44 UTC, Steven Schveighoffer wrote:
I hate to have feature creep at this point, but one kind of annoying thing is, if you want to *add* to the current environment, it is a multi-step
process:

auto curenv = environment.toAA;
curenv["x"] = "y";
spawnProcess("helloworld", curenv);

But with something similar to Dennis' idea, we have a possible way to do that without making a copy of the current environment into an AA and
adding:

struct EnvironmentArg
{
this(string[string] env, bool useParent=false) { this.env = env;
this.useParent = useParent;}
     this(bool useParent) {this.useParent = useParent;}
     string[string] env;
     bool useParent;
}

spawnProcess("helloworld", EnvironmentArg(["x":"y"], true)); // use parent
environment, add x=y
spawnProcess("helloworld", EnvironmentArg(["x":"y"])); // replace
environment with x=y
spawnProcess("helloworld", EnvironmentArg(false)); // use empty environment
spawnProcess("helloworld", EnvironmentArg(true)); // use parent
environment exactly

EnvironmentArg should probably have better name, and I would recommend
some global functions that make common things, like:

EnvironmentArg emptyEnvironment() { return EnvironmentArg(null, false);} EnvironmentArg parentEnvironment() { return EnvironmentArg(null, true);}

Like? Hate?

Hmm.. what if spawnProcess() takes a normal string[string] like it does now, but we add a flag to Config that determines whether it is merged with the parent's environment or not?

string[string] myEnv = [ "foo" : "bar" ];
spawnProcess("helloworld", null);     // Parent's env
spawnProcess("helloworld", myEnv);    // Parent's env + myEnv
spawnProcess("helloworld", null, ..., Config.clearEnv); // Empty env spawnProcess("helloworld", myEnv, ..., Config.clearEnv); // Only myEnv

Lars

Reply via email to