diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2006-12-12T16·14+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2006-12-12T16·14+0000 |
commit | 1a7e88bbd9290987e72616d42c9e9d344acc2a86 (patch) | |
tree | 6eb4f83ec6270a30cb137b5e84d0c380354bb5cb /src/libexpr | |
parent | 5e6699188fba38619dc23c0b65ee70849f90ea6c (diff) |
* New built-in function `builtins.attrNames' that returns the
names of the attributes in an attribute set.
Diffstat (limited to 'src/libexpr')
-rw-r--r-- | src/libexpr/primops.cc | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 1d0d9c6b2245..fcf0354509a2 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -620,6 +620,26 @@ static Expr primGetEnv(EvalState & state, const ATermVector & args) } +/* Return the names of the attributes in an attribute set as a sorted + list of strings. */ +static Expr primAttrNames(EvalState & state, const ATermVector & args) +{ + ATermMap attrs(128); /* !!! */ + queryAllAttrs(evalExpr(state, args[0]), attrs); + + StringSet names; + for (ATermMap::const_iterator i = attrs.begin(); i != attrs.end(); ++i) + names.insert(aterm2String(i->key)); + + ATermList list = ATempty; + for (StringSet::const_reverse_iterator i = names.rbegin(); + i != names.rend(); ++i) + list = ATinsert(list, makeStr(*i, PathSet())); + + return makeList(list); +} + + /* Apply a function to every element of a list. */ static Expr primMap(EvalState & state, const ATermVector & args) { @@ -732,6 +752,7 @@ void EvalState::addPrimOps() addPrimOp("__head", 1, primHead); addPrimOp("__tail", 1, primTail); addPrimOp("__getEnv", 1, primGetEnv); + addPrimOp("__attrNames", 1, primAttrNames); addPrimOp("map", 2, primMap); addPrimOp("__getAttr", 2, primGetAttr); |