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