The new std.process is ready for review

Steven Schveighoffer schveiguy at yahoo.com
Wed Mar 13 13:27:33 PDT 2013


On Wed, 13 Mar 2013 02:45:57 -0400, dennis luehring <dl.soluz at gmx.net>
wrote:

> why not differentiate on callsite?
>
> like
>
> environment_usage =
> {
>    PARENT_ENVIRONMENT,
>    NONE_ENVIRONMENT, // which differs from empty given environment
>    GIVEN_ENVIRONMENT
> }
>
> spawnProcess(process,parameter,environment_usage = PARENT_ENVIRONMENT,  
> environemnt = null)
>
> it feels very wrong to put the environment "usage" type in any way into  
> the environment-abstraction itself (by occupying null or empty...)
>
> +some nice helpers
>
> spawnProcessWithParentEnvironment((process,parameter)
> spawnProcessWithoutEnvironment((process,parameter)
> spawnProcessWithEnvironment((process,parameter,environment=...)
>
> woulnd't that be much clearer?
>
> the other way could be an
>
> spawnProcess(process,parameter,environment=use_parent_environment());
> with parent-environment selector
>
> spawnProcess(process,parameter,environment=given_environment(environment));

Hm.. I think I actually like this.

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?

-Steve


More information about the Digitalmars-d mailing list