forked from lix-project/lix
* Change the semantics of "with" so that inner "withs" take
precedence, i.e. `with {x=1;}; with {x=2;}; x' evaluates to 2'. This has a simpler implementation and seems more natural. There doesn't seem to be any code in Nixpkgs or NixOS that relies on the old behaviour.
This commit is contained in:
parent
816f9c0f6f
commit
85d13c8f93
|
@ -232,19 +232,6 @@ void mkPath(Value & v, const char * s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Value * EvalState::lookupWith(Env * env, const Symbol & name)
|
|
||||||
{
|
|
||||||
if (!env) return 0;
|
|
||||||
Value * v = lookupWith(env->up, name);
|
|
||||||
if (v) return v;
|
|
||||||
Bindings::iterator i = env->bindings.find(sWith);
|
|
||||||
if (i == env->bindings.end()) return 0;
|
|
||||||
Bindings::iterator j = i->second.attrs->find(name);
|
|
||||||
if (j != i->second.attrs->end()) return &j->second;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Value * EvalState::lookupVar(Env * env, const Symbol & name)
|
Value * EvalState::lookupVar(Env * env, const Symbol & name)
|
||||||
{
|
{
|
||||||
/* First look for a regular variable binding for `name'. */
|
/* First look for a regular variable binding for `name'. */
|
||||||
|
@ -254,22 +241,14 @@ Value * EvalState::lookupVar(Env * env, const Symbol & name)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Otherwise, look for a `with' attribute set containing `name'.
|
/* Otherwise, look for a `with' attribute set containing `name'.
|
||||||
Outer `withs' take precedence (i.e. `with {x=1;}; with {x=2;};
|
Inner `withs' take precedence (i.e. `with {x=1;}; with {x=2;};
|
||||||
x' evaluates to 1). */
|
x' evaluates to 2). */
|
||||||
Value * v = lookupWith(env, name);
|
|
||||||
if (v) return v;
|
|
||||||
|
|
||||||
/* Alternative implementation where the inner `withs' take
|
|
||||||
precedence (i.e. `with {x=1;}; with {x=2;}; x' evaluates to
|
|
||||||
2). */
|
|
||||||
#if 0
|
|
||||||
for (Env * env2 = env; env2; env2 = env2->up) {
|
for (Env * env2 = env; env2; env2 = env2->up) {
|
||||||
Bindings::iterator i = env2->bindings.find(sWith);
|
Bindings::iterator i = env2->bindings.find(sWith);
|
||||||
if (i == env2->bindings.end()) continue;
|
if (i == env2->bindings.end()) continue;
|
||||||
Bindings::iterator j = i->second.attrs->find(name);
|
Bindings::iterator j = i->second.attrs->find(name);
|
||||||
if (j != i->second.attrs->end()) return &j->second;
|
if (j != i->second.attrs->end()) return &j->second;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
throwEvalError("undefined variable `%1%'", name);
|
throwEvalError("undefined variable `%1%'", name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -240,8 +240,6 @@ private:
|
||||||
|
|
||||||
Value * lookupVar(Env * env, const Symbol & name);
|
Value * lookupVar(Env * env, const Symbol & name);
|
||||||
|
|
||||||
Value * lookupWith(Env * env, const Symbol & name);
|
|
||||||
|
|
||||||
friend class ExprVar;
|
friend class ExprVar;
|
||||||
friend class ExprAttrs;
|
friend class ExprAttrs;
|
||||||
friend class ExprLet;
|
friend class ExprLet;
|
||||||
|
|
Loading…
Reference in a new issue