* 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:
Eelco Dolstra 2005-05-18 17:19:21 +00:00
parent 109cde6706
commit 040140dd1c
4 changed files with 29 additions and 0 deletions

View File

@ -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);
} }

View File

@ -0,0 +1,5 @@
let {
attrs = {x = 123; y = 456;};
body = (removeAttrs attrs ["x"]).x;
}

View File

@ -0,0 +1 @@
Int(456)

View File

@ -0,0 +1,5 @@
let {
attrs = {x = 123; y = 456;};
body = (removeAttrs attrs ["x"]).y;
}