On Wed, Mar 13, 2013 at 09:43:59PM +0100, Lars T. Kyllingstad wrote:
> On Wednesday, 13 March 2013 at 20:26:44 UTC, Steven Schveighoffer
> wrote:
[...]
> >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
[...]

+1. I like this idea. Makes code more self-documenting, which is a good
thing.

Alternatively:

        struct useParentEnv { string[string] aa; }
        struct newEnv { string[string] aa; }

        spawnProcess(E)(string program, E env, ...) {
                static if (is(E == useParentEnv))
                        // inherit values from current environment
                else
                        // don't inherit from current environment
        }

        spawnProcess("helloworld", useParentEnv(["a": "b", ... ]), ...);
        spawnProcess("helloworld", newEnv(["a": "b", ... ]), ...);

Of course, rename useParentEnv and newEnv to something more suitable.


T

-- 
"You know, maybe we don't *need* enemies." "Yeah, best friends are about all I 
can take." -- Calvin & Hobbes

Reply via email to