forked from lix-project/lix
* Added a primop `removeAttrs' to remove attributes from a set, e.g.,
`removeAttrs attrs ["x", "y"]' returns the set `attrs' with the attributes named `x' and `y' removed. It is not an error for the named attributes to be missing from the input set.
This commit is contained in:
parent
109cde6706
commit
040140dd1c
|
@ -444,6 +444,23 @@ static Expr primCurrentTime(EvalState & state, const ATermVector & args)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static Expr primRemoveAttrs(EvalState & state, const ATermVector & args)
|
||||||
|
{
|
||||||
|
ATermMap attrs;
|
||||||
|
queryAllAttrs(evalExpr(state, args[0]), attrs, true);
|
||||||
|
|
||||||
|
ATermList list;
|
||||||
|
if (!matchList(evalExpr(state, args[1]), list))
|
||||||
|
throw Error("`removeAttrs' expects a list as its second argument");
|
||||||
|
|
||||||
|
for (ATermIterator i(list); i; ++i)
|
||||||
|
/* It's not an error for *i not to exist. */
|
||||||
|
attrs.remove(evalString(state, *i));
|
||||||
|
|
||||||
|
return makeAttrs(attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void EvalState::addPrimOps()
|
void EvalState::addPrimOps()
|
||||||
{
|
{
|
||||||
addPrimOp("true", 0, primTrue);
|
addPrimOp("true", 0, primTrue);
|
||||||
|
@ -460,6 +477,7 @@ void EvalState::addPrimOps()
|
||||||
addPrimOp("isNull", 1, primIsNull);
|
addPrimOp("isNull", 1, primIsNull);
|
||||||
|
|
||||||
addPrimOp("map", 2, primMap);
|
addPrimOp("map", 2, primMap);
|
||||||
|
addPrimOp("removeAttrs", 2, primRemoveAttrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
5
tests/lang/eval-fail-remove.nix
Normal file
5
tests/lang/eval-fail-remove.nix
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
let {
|
||||||
|
attrs = {x = 123; y = 456;};
|
||||||
|
|
||||||
|
body = (removeAttrs attrs ["x"]).x;
|
||||||
|
}
|
1
tests/lang/eval-okay-remove.exp
Normal file
1
tests/lang/eval-okay-remove.exp
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Int(456)
|
5
tests/lang/eval-okay-remove.nix
Normal file
5
tests/lang/eval-okay-remove.nix
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
let {
|
||||||
|
attrs = {x = 123; y = 456;};
|
||||||
|
|
||||||
|
body = (removeAttrs attrs ["x"]).y;
|
||||||
|
}
|
Loading…
Reference in a new issue