On Monday, 1 August 2022 at 14:15:31 UTC, pascal111 wrote:
> We all know the strange syntax of lambda function within filter algorithm like "auto r = chain(a, b).filter!(a => a > 0);".
TBH I don't find lambda syntax strange - it's pretty nice and there are two forms (unlike in C++): short one (a => a > 0
) and long one ((a) { return a > 0; }
).
Compare to C++ lambda syntax: [](auto a) { return a > 0; }
> My note is, don't we break D rules by leaving ";" after lambda function syntax?!
There is no breakage: a => a > 0
in this example is a (template) parameter to filter
function. You can rewrite it in different ways, like: filter!((a) { return a > 0; })
or
alias criteria = (a) { return a > 0; };
auto r = chain(a, b).filter!criteria;
or even longer:
auto criteria(T)(T a)
{
return a > 0;
}
auto r = chain(a, b).filter!criteria;
> Many of D rules are taken from C, we know that, so a general basic rule is to put ";" after each statement
I think this is more or less correct but I personally like that I don't need to put ";" after definition of a class or struct unlike in C.
> so the previous statement of filter should be "auto r = chain(a, b).filter!(a => a > 0;);"? Why D leaves ";" in this case?
No. it should not. The statement here is auto r = chain(a, b).filter!(a => a > 0);
, not a => a > 0
. If you use longer version of lambda syntax then yes, you'll see ";" there: auto r = chain(a, b).filter!((a) { return a > 0; });
but ";" is not after lambda function, it's inside because you have {...}
function body (which, I believe, is defined as a sequence of statements so you have ";" there).
Again, both a => a > 0
and (a) { return a > 0; }
are just parameters to filter
function. Parameters are not terminated with ";". This is the same as in C - you are not adding ";" after function parameter:
auto is_even = [](int i){ return i%2 == 0; };
auto result = std::find(..., ..., is_even);