Bitten by the lambda parameter name
Zhong Yu
zhong.j.yu at gmail.com
Thu Jul 18 17:40:15 PDT 2013
On Thu, Jul 18, 2013 at 5:34 PM, John Rose <john.r.rose at oracle.com> wrote:
> On Jul 17, 2013, at 9:48 AM, Zhong Yu <zhong.j.yu at gmail.com> wrote:
>
> I personally don't think it's a strong enough case; when I read
> x->++x, I'll see this is a new x, and the new x is being incremented.
>
>
> Many of the Java language safety rules (including local shadowing rules) are
> not designed for the people on this mailing list. They are designed for the
> other 99% of programmers, who are not so eager to process language corner
> cases. And shadowing, however natural its logic is, gets experienced as a
> corner case, often enough to cause bugs in the field. (No I don't have
> survey numbers.)
>
> The value of anti-shadowing rules is less when declarations are more visible
> and/or can be placed in fewer syntactic locations. This is why class
> members can participate in shadowing: Class members generally occupy their
> own lines of code. Parameters and locals are often declared inside other
> constructs (method headers, for loops), so they are harder to see.
> Therefore, multiple competing definitions of these constructs are more
> confusing. Guess which category lambda parameters fall in? Hint: A lambda
> parameter declaration can be one token long, and embedded in an expression.
>
> So, regardless of how it outrages syntax-savvy users, I think it is better
> to forbid having lambda parameters participate in shadowing.
>
> The two proposed use cases of (foo) -> (expr_not_containing_foo) seem
> especially wrong-headed to me. Why *must* we allow users to have the exact
> name "foo", for a variable that isn't even used? Because it is so important
> to insert a clever comment that the formal parameter "foo" (though unused)
> is known to the programmer to have the same value as an uplevel variable
> named "foo"? There are other ways to comment code than choose a name for an
> unused variable!
Hi John, what name do you propose for the lambda parameter?
I don't think this would make sense:
computeIfAbsent(kind, unused -> new HashSet<>())
Maybe just an underscore as the parameter?
computeIfAbsent(kind, _ -> new HashSet<>())
It's too cryptic. We prefer words as identifiers.
Underscore prefix is probably better
computeIfAbsent(kind, _kind -> new HashSet<>())
Or maybe dollar prefix
computeIfAbsent(kind, $kind -> new HashSet<>())
which solves another problem for people like me who wanted a heavy
symbol in front of a lambda expression but were robbed of our beloved
# symbol.
Zhong Yu
More information about the lambda-dev
mailing list