* New builtin functions builtins.{hasAttr, getAttr} to check for

attribute existence and to return an attribute from an attribute
  set, respectively.  Example: `hasAttr "foo" {foo = 1;}'.  They
  differ from the `?' and `.' operators in that the attribute name is
  an arbitrary expression.  (NIX-61)
This commit is contained in:
Eelco Dolstra 2006-09-22 14:31:55 +00:00
parent 666babbbfa
commit 8a1ab709a4
3 changed files with 27 additions and 0 deletions

View File

@ -703,6 +703,20 @@ static Expr primCurrentTime(EvalState & state, const ATermVector & args)
}
static Expr primGetAttr(EvalState & state, const ATermVector & args)
{
string attr = evalString(state, args[0]);
return evalExpr(state, makeSelect(args[1], toATerm(attr)));
}
static Expr primHasAttr(EvalState & state, const ATermVector & args)
{
string attr = evalString(state, args[0]);
return evalExpr(state, makeOpHasAttr(args[1], toATerm(attr)));
}
static Expr primRemoveAttrs(EvalState & state, const ATermVector & args)
{
ATermMap attrs(128); /* !!! */
@ -749,6 +763,8 @@ void EvalState::addPrimOps()
addPrimOp("abort", 1, primAbort);
addPrimOp("map", 2, primMap);
addPrimOp("__getAttr", 2, primGetAttr);
addPrimOp("__hasAttr", 2, primHasAttr);
addPrimOp("removeAttrs", 2, primRemoveAttrs);
addPrimOp("relativise", 2, primRelativise);
}

View File

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

View File

@ -0,0 +1,10 @@
let {
as = { x = 123; y = 456; } // { z = 789; } // { z = 987; };
A = "a";
Z = "z";
body = if builtins.hasAttr A as
then builtins.getAttr A as
else assert builtins.hasAttr Z as; builtins.getAttr Z as;
}