mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-27 00:06:16 +02:00
* An attribute set update operator (//). E.g.,
{x=1; y=2; z=3;} // {y=4;} => {x=1; y=4; z=3;}
This commit is contained in:
parent
6d46e647ba
commit
9d25466b34
3 changed files with 19 additions and 0 deletions
|
@ -134,6 +134,18 @@ ATerm expandRec(ATerm e, ATermList rbnds, ATermList nrbnds)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static Expr updateAttrs(Expr e1, Expr e2)
|
||||||
|
{
|
||||||
|
/* Note: e1 and e2 should be in normal form. */
|
||||||
|
|
||||||
|
ATermMap attrs;
|
||||||
|
queryAllAttrs(e1, attrs);
|
||||||
|
queryAllAttrs(e2, attrs);
|
||||||
|
|
||||||
|
return makeAttrs(attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
string evalString(EvalState & state, Expr e)
|
string evalString(EvalState & state, Expr e)
|
||||||
{
|
{
|
||||||
e = evalExpr(state, e);
|
e = evalExpr(state, e);
|
||||||
|
@ -264,6 +276,10 @@ Expr evalExpr2(EvalState & state, Expr e)
|
||||||
if (atMatch(m, e) >> "OpOr" >> e1 >> e2)
|
if (atMatch(m, e) >> "OpOr" >> e1 >> e2)
|
||||||
return makeBool(evalBool(state, e1) || evalBool(state, e2));
|
return makeBool(evalBool(state, e1) || evalBool(state, e2));
|
||||||
|
|
||||||
|
/* Attribut set update (//). */
|
||||||
|
if (atMatch(m, e) >> "OpUpdate" >> e1 >> e2)
|
||||||
|
return updateAttrs(evalExpr(state, e1), evalExpr(state, e2));
|
||||||
|
|
||||||
/* Barf. */
|
/* Barf. */
|
||||||
throw badTerm("invalid expression", e);
|
throw badTerm("invalid expression", e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,6 +57,7 @@ inherit { return INHERIT; }
|
||||||
\&\& { return AND; }
|
\&\& { return AND; }
|
||||||
\|\| { return OR; }
|
\|\| { return OR; }
|
||||||
\-\> { return IMPL; }
|
\-\> { return IMPL; }
|
||||||
|
\/\/ { return UPDATE; }
|
||||||
|
|
||||||
{ID} { yylval->t = ATmake("<str>", yytext); return ID; /* !!! alloc */ }
|
{ID} { yylval->t = ATmake("<str>", yytext); return ID; /* !!! alloc */ }
|
||||||
{INT} { int n = atoi(yytext); /* !!! overflow */
|
{INT} { int n = atoi(yytext); /* !!! overflow */
|
||||||
|
|
|
@ -42,6 +42,7 @@ void yyerror(YYLTYPE * loc, yyscan_t scanner, void * data, char * s)
|
||||||
%left OR
|
%left OR
|
||||||
%left AND
|
%left AND
|
||||||
%nonassoc EQ NEQ
|
%nonassoc EQ NEQ
|
||||||
|
%right UPDATE
|
||||||
%left NEG
|
%left NEG
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
@ -69,6 +70,7 @@ expr_op
|
||||||
| expr_op AND expr_op { $$ = ATmake("OpAnd(<term>, <term>)", $1, $3); }
|
| expr_op AND expr_op { $$ = ATmake("OpAnd(<term>, <term>)", $1, $3); }
|
||||||
| expr_op OR expr_op { $$ = ATmake("OpOr(<term>, <term>)", $1, $3); }
|
| expr_op OR expr_op { $$ = ATmake("OpOr(<term>, <term>)", $1, $3); }
|
||||||
| expr_op IMPL expr_op { $$ = ATmake("OpImpl(<term>, <term>)", $1, $3); }
|
| expr_op IMPL expr_op { $$ = ATmake("OpImpl(<term>, <term>)", $1, $3); }
|
||||||
|
| expr_op UPDATE expr_op { $$ = ATmake("OpUpdate(<term>, <term>)", $1, $3); }
|
||||||
| expr_app
|
| expr_app
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue