Skip to content

Commit

Permalink
Implement another syntax for nullary lambdas
Browse files Browse the repository at this point in the history
refs #7564
  • Loading branch information
gunnarbeutner committed Jan 30, 2015
1 parent c01fb97 commit aeb579d
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 0 deletions.
10 changes: 10 additions & 0 deletions doc/15-language-reference.md
Expand Up @@ -574,6 +574,16 @@ For lambdas which take exactly one argument the braces around the arguments can

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

When setting a variable Icinga checks the following scopes in this order whether the variable
Expand Down
2 changes: 2 additions & 0 deletions lib/config/config_lexer.ll
Expand Up @@ -217,6 +217,8 @@ while return T_WHILE;
in return T_IN;
&& return T_LOGICAL_AND;
\|\| 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 + 1); return T_IDENTIFIER; }
\<[^ \>]*\> { yytext[yyleng-1] = '\0'; yylval->text = strdup(yytext + 1); return T_STRING_ANGLE; }
Expand Down
19 changes: 19 additions & 0 deletions lib/config/config_parser.yy
Expand Up @@ -177,6 +177,8 @@ static void MakeRBinaryOp(Expression** result, Expression *left, Expression *rig
%token T_ELSE "else (T_ELSE)"
%token T_WHILE "while (T_WHILE)"
%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 <elist> rterm_items
Expand Down Expand Up @@ -871,6 +873,23 @@ rterm_no_side_effect: T_STRING
$$ = new FunctionExpression(*$3, $5, aexpr, @$);
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
Expand Down

0 comments on commit aeb579d

Please sign in to comment.