* listToAttrs: the list now should consist of {name, value} attribute

sets instead of {attr, value}.  "name" is better than "attr" because
  the *combination* of the two forms the attribute.
This commit is contained in:
Eelco Dolstra 2007-10-09 12:51:25 +00:00
parent 8a9fe6c11c
commit 27a0662828
1 changed files with 29 additions and 28 deletions

View File

@ -755,36 +755,37 @@ static Expr prim_hasAttr(EvalState & state, const ATermVector & args)
} }
/* takes /* Builds an attribute set from a list specifying (name, value)
* param: list of { attr="attr"; value=value } pairs. To be precise, a list [{name = "name1"; value = value1;}
* returns an attribute set ... {name = "nameN"; value = valueN;}] is transformed to {name1 =
* */ value1; ... nameN = valueN;}. */
static Expr prim_listToAttrs(EvalState & state, const ATermVector & args) static Expr prim_listToAttrs(EvalState & state, const ATermVector & args)
{ {
try { try {
ATermMap res = ATermMap(); ATermMap res = ATermMap();
ATermList list;
ATermList list; list = evalList(state, args[0]);
list = evalList(state, args[0]); for (ATermIterator i(list); i; ++i){
for (ATermIterator i(list); i; ++i){ // *i should now contain a pointer to the list item expression
// *i should now contain a pointer to the list item expression ATermList attrs;
ATermList attrs; Expr evaledExpr = evalExpr(state, *i);
Expr evaledExpr = evalExpr(state, *i); if (matchAttrs(evaledExpr, attrs)){
if (matchAttrs(evaledExpr, attrs)){ Expr e = evalExpr(state, makeSelect(evaledExpr, toATerm("name")));
Expr e = evalExpr(state, makeSelect(evaledExpr, toATerm("attr"))); string attr = evalStringNoCtx(state,e);
string attr = evalStringNoCtx(state,e); Expr r = makeSelect(evaledExpr, toATerm("value"));
Expr r = makeSelect(evaledExpr, toATerm("value")); res.set(toATerm(attr), makeAttrRHS(r, makeNoPos()));
res.set(toATerm(attr), makeAttrRHS(r, makeNoPos())); }
} else
else { throw TypeError(format("list element in `listToAttrs' is %s, expected a set { name = \"<name>\"; value = <value>; }")
throw EvalError(format("passed list item is a %s (value: %s). Set { attr=\"name\"; value=nix expr; } expected.") % showType(evaledExpr) % showValue(evaledExpr)); % showType(evaledExpr));
} }
} // for
return makeAttrs(res); return makeAttrs(res);
} catch (Error & e) {
e.addPrefix(format("in `listToAttrs':\n")); } catch (Error & e) {
throw; e.addPrefix(format("in `listToAttrs':\n"));
} throw;
}
} }
static Expr prim_removeAttrs(EvalState & state, const ATermVector & args) static Expr prim_removeAttrs(EvalState & state, const ATermVector & args)