mirror of https://github.com/Icinga/icinga2.git
parent
c01fb97337
commit
aeb579d2a0
|
@ -574,6 +574,16 @@ For lambdas which take exactly one argument the braces around the arguments can
|
||||||
|
|
||||||
f = x => x * x
|
f = x => x * x
|
||||||
|
|
||||||
|
## <a id="nullary-lambdas"></a> Abbreviated Lambda Syntax
|
||||||
|
|
||||||
|
Lambdas which take no arguments can also be written using the abbreviated lambda syntax.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
f = {{ 3 }}
|
||||||
|
|
||||||
|
This creates a new function which returns the value 3.
|
||||||
|
|
||||||
## <a id="variable-scopes"></a> Variable Scopes
|
## <a id="variable-scopes"></a> Variable Scopes
|
||||||
|
|
||||||
When setting a variable Icinga checks the following scopes in this order whether the variable
|
When setting a variable Icinga checks the following scopes in this order whether the variable
|
||||||
|
|
|
@ -217,6 +217,8 @@ while return T_WHILE;
|
||||||
in return T_IN;
|
in return T_IN;
|
||||||
&& return T_LOGICAL_AND;
|
&& return T_LOGICAL_AND;
|
||||||
\|\| return T_LOGICAL_OR;
|
\|\| return T_LOGICAL_OR;
|
||||||
|
\{\{ return T_NULLARY_LAMBDA_BEGIN;
|
||||||
|
\}\} return T_NULLARY_LAMBDA_END;
|
||||||
[a-zA-Z_][a-zA-Z0-9\_]* { yylval->text = strdup(yytext); return T_IDENTIFIER; }
|
[a-zA-Z_][a-zA-Z0-9\_]* { yylval->text = strdup(yytext); return T_IDENTIFIER; }
|
||||||
@[a-zA-Z_][a-zA-Z0-9\_]* { yylval->text = strdup(yytext + 1); return T_IDENTIFIER; }
|
@[a-zA-Z_][a-zA-Z0-9\_]* { yylval->text = strdup(yytext + 1); return T_IDENTIFIER; }
|
||||||
\<[^ \>]*\> { yytext[yyleng-1] = '\0'; yylval->text = strdup(yytext + 1); return T_STRING_ANGLE; }
|
\<[^ \>]*\> { yytext[yyleng-1] = '\0'; yylval->text = strdup(yytext + 1); return T_STRING_ANGLE; }
|
||||||
|
|
|
@ -177,6 +177,8 @@ static void MakeRBinaryOp(Expression** result, Expression *left, Expression *rig
|
||||||
%token T_ELSE "else (T_ELSE)"
|
%token T_ELSE "else (T_ELSE)"
|
||||||
%token T_WHILE "while (T_WHILE)"
|
%token T_WHILE "while (T_WHILE)"
|
||||||
%token T_FOLLOWS "=> (T_FOLLOWS)"
|
%token T_FOLLOWS "=> (T_FOLLOWS)"
|
||||||
|
%token T_NULLARY_LAMBDA_BEGIN "{{ (T_NULLARY_LAMBDA_BEGIN)"
|
||||||
|
%token T_NULLARY_LAMBDA_END "}} (T_NULLARY_LAMBDA_END)"
|
||||||
|
|
||||||
%type <text> identifier
|
%type <text> identifier
|
||||||
%type <elist> rterm_items
|
%type <elist> rterm_items
|
||||||
|
@ -871,6 +873,23 @@ rterm_no_side_effect: T_STRING
|
||||||
$$ = new FunctionExpression(*$3, $5, aexpr, @$);
|
$$ = new FunctionExpression(*$3, $5, aexpr, @$);
|
||||||
delete $3;
|
delete $3;
|
||||||
}
|
}
|
||||||
|
| T_NULLARY_LAMBDA_BEGIN statements T_NULLARY_LAMBDA_END
|
||||||
|
{
|
||||||
|
std::vector<Expression *> dlist;
|
||||||
|
typedef std::pair<Expression *, EItemInfo> EListItem;
|
||||||
|
int num = 0;
|
||||||
|
BOOST_FOREACH(const EListItem& litem, *$2) {
|
||||||
|
if (!litem.second.SideEffect && num != $2->size() - 1)
|
||||||
|
yyerror(&litem.second.DebugInfo, NULL, NULL, "Value computed is not used.");
|
||||||
|
dlist.push_back(litem.first);
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
delete $2;
|
||||||
|
DictExpression *aexpr = new DictExpression(dlist, @$);
|
||||||
|
aexpr->MakeInline();
|
||||||
|
|
||||||
|
$$ = new FunctionExpression(std::vector<String>(), NULL, aexpr, @$);
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
rterm: rterm_side_effect
|
rterm: rterm_side_effect
|
||||||
|
|
Loading…
Reference in New Issue