forked from lix-project/lix
* Implemented `rec { inherit ...; }'.
This commit is contained in:
parent
4c53ca2692
commit
13c2adc897
|
@ -73,6 +73,9 @@ void run(Strings args)
|
||||||
doTest("map (x: __add 1 x) [ 1 2 3 ]");
|
doTest("map (x: __add 1 x) [ 1 2 3 ]");
|
||||||
doTest("map (builtins.add 1) [ 1 2 3 ]");
|
doTest("map (builtins.add 1) [ 1 2 3 ]");
|
||||||
doTest("builtins.hasAttr \"x\" { x = 1; }");
|
doTest("builtins.hasAttr \"x\" { x = 1; }");
|
||||||
|
doTest("let x = 1; as = rec { inherit x; y = as.x; }; in as.y");
|
||||||
|
doTest("let as = { x = 1; }; bs = rec { inherit (as) x; y = x; }; in bs.y");
|
||||||
|
doTest("let as = rec { inherit (y) x; y = { x = 1; }; }; in as.x");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -326,11 +326,16 @@ void EvalState::eval(Env & env, Expr e, Value & v)
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (matchRec(e, rbnds, nrbnds)) {
|
else if (matchRec(e, rbnds, nrbnds)) {
|
||||||
|
/* Create a new environment that contains the attributes in
|
||||||
|
this `rec'. */
|
||||||
Env & env2(allocEnv());
|
Env & env2(allocEnv());
|
||||||
env2.up = &env;
|
env2.up = &env;
|
||||||
|
|
||||||
v.type = tAttrs;
|
v.type = tAttrs;
|
||||||
v.attrs = &env2.bindings;
|
v.attrs = &env2.bindings;
|
||||||
|
|
||||||
|
/* The recursive attributes are evaluated in the new
|
||||||
|
environment. */
|
||||||
ATerm name, e2, pos;
|
ATerm name, e2, pos;
|
||||||
for (ATermIterator i(rbnds); i; ++i) {
|
for (ATermIterator i(rbnds); i; ++i) {
|
||||||
if (!matchBind(*i, name, e2, pos)) abort(); /* can't happen */
|
if (!matchBind(*i, name, e2, pos)) abort(); /* can't happen */
|
||||||
|
@ -338,6 +343,15 @@ void EvalState::eval(Env & env, Expr e, Value & v)
|
||||||
nrValues++;
|
nrValues++;
|
||||||
mkThunk(v2, env2, e2);
|
mkThunk(v2, env2, e2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The non-recursive attributes, on the other hand, are
|
||||||
|
evaluated in the original environment. */
|
||||||
|
for (ATermIterator i(nrbnds); i; ++i) {
|
||||||
|
if (!matchBind(*i, name, e2, pos)) abort(); /* can't happen */
|
||||||
|
Value & v2 = env2.bindings[name];
|
||||||
|
nrValues++;
|
||||||
|
mkThunk(v2, env, e2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (matchSelect(e, e2, name)) {
|
else if (matchSelect(e, e2, name)) {
|
||||||
|
|
Loading…
Reference in a new issue