...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
#include <boost/phoenix/scope/let.hpp>
You declare local variables using the syntax:
let(local-declarations) [ let-body ]
let
allows 1..N local variable
declarations (where N == BOOST_PHOENIX_LOCAL_LIMIT
).
Each declaration follows the form:
local-id = lambda-expression
Note | |
---|---|
You can set |
Example:
let(_a = 123, _b = 456) [ _a + _b ]
Reference Preservation
The type of the local variable assumes the type of the lambda- expression. Type deduction is reference preserving. For example:
let(_a = arg1, _b = 456)
_a
assumes the type of
arg1
: a reference to an
argument, while _b
has
type int
.
Consider this:
int i = 1; let(_a = arg1) [ cout << --_a << ' ' ] (i); cout << i << endl;
the output of above is : 0 0
While with this:
int i = 1; let(_a = val(arg1)) [ cout << --_a << ' ' ] (i); cout << i << endl;
the output is : 0 1
Reference preservation is necessary because we need to have L-value access
to outer lambda-scopes (especially the arguments). arg
s
and ref
s are L-values.
val
s are R-values.
The scope and lifetimes of the local variables is limited within the let-body.
let
blocks can be nested.
A local variable may hide an outer local variable. For example:
let(_x = _1, _y = _2) [ // _x here is an int: 1 let(_x = _3) // hides the outer _x [ cout << _x << _y // prints "Hello, World" ] ](1," World","Hello,");
The actual values of the parameters _1, _2 and _3 are supplied from the
bracketed list at the end of the let
.
There is currently a limitation that the inner let
cannot be supplied with a constant e.g. let(_x = 1)
.
The RHS (right hand side lambda-expression) of each local-declaration cannot refer to any LHS local-id. At this point, the local-ids are not in scope yet; they will only be in scope in the let-body. The code below is in error:
let( _a = 1 , _b = _a // Error: _a is not in scope yet ) [ // _a and _b's scope starts here /*. body .*/ ]
However, if an outer let scope is available, this will be searched. Since the scope of the RHS of a local-declaration is the outer scope enclosing the let, the RHS of a local-declaration can refer to a local variable of an outer scope:
let(_a = 1) [ let( _a = _1 , _b = _a // Ok. _a refers to the outer _a ) [ /*. body .*/ ] ](1)