Bitten by the lambda parameter name
Zhong Yu
zhong.j.yu at gmail.com
Tue Jul 16 16:59:39 PDT 2013
On Tue, Jul 16, 2013 at 6:48 PM, maurizio cimadamore
<maurizio.cimadamore at oracle.com> wrote:
> On 17-Jul-13 12:37 AM, Zhong Yu wrote:
>>
>> I don't think people have problems to keep track of scope stacks and
>> associate a name with its closest definition. Do we have testimonies
>> of confusions from other languages that allow reusing local names in
>> lambda parameters?
>
> Speaking about Java, there is a scoping rule that drives me crazy, and it's
> the one for the for-each loop; it should be legal to say:
>
> Collection<String> s = ...
> for (String s : s) {
I don't know if you are being sarcastic or not, but `for(s : s)` does
not make any sense to me... something that contains itself?
But here's an example that I think does make sense and shoulda compiled
String string = ...;
...
List<String> strings = ...;
for(String string : strings) // reuse "string"
...
> ...
> }
>
> This example features the same kind of disambiguation pattern that I've seen
> applied in most examples here - stuff on the left of the ':' (or '->') has
> one meaning, stuff on the right has another meaning.
>
> The only example I would be more comfortable with, is the last one you sent,
> where you use the same parameter name in two different nesting levels. This
> is slightly different from what we have discussed so far.
>
> Maurizio
>
>>
>> On Tue, Jul 16, 2013 at 6:25 PM, maurizio cimadamore
>> <maurizio.cimadamore at oracle.com> wrote:
>>>
>>> On 16-Jul-13 11:59 PM, Remi Forax wrote:
>>>>
>>>> On 07/17/2013 12:40 AM, maurizio cimadamore wrote:
>>>>>
>>>>> On 16-Jul-13 11:17 PM, Dan Smith wrote:
>>>>>>>
>>>>>>> StringBuilder builder = createText(StringBuilder.class, builder
>>>>>>
>>>>>> -> builder.append("name"));
>>>>>
>>>>> What is this meant to replace exactly? It's a shorthand for:
>>>>>
>>>>> StringBuilder builder = new StringBuilder();
>>>>> builder.append("name");
>>>>>
>>>>> ?
>>>>>
>>>>> Maurizio
>>>>
>>>> Again, I'm not sure why this is interesting to know exactly what the
>>>> code does,
>>>> Anyway, the code of createText allows you to create a mutable object
>>>> by reflection, to initialize it and when you get the result,
>>>> you have the guarantee that you can never see the object half
>>>> initialized.
>>>
>>> I'm asking about the code, because I think that if we are forcing people
>>> to write code like that there might be a problem other than the scope
>>> issue.
>>> Having two variables so close with the same name is confusing - no
>>> matter how the language will pan out in the end. YOu seem to imply that
>>> using the same name is justified by the fact that the two objects are
>>> really the same - but I'm less sure that many people will be able to
>>> read your code and immediately grasp as to why the two variables are
>>> named in the same way. I think a good API should minimize occurrences of
>>> that for the users sake.
>>>
>>> Maurizio
>>>>
>>>> Rémi
>>>>
>>>>
>>>>
>>>
>
More information about the lambda-dev
mailing list