A simple solution for [] access that can trivially be added to List and Map.

Reinier Zwitserloot reinier at zwitserloot.com
Thu Jun 25 15:17:52 PDT 2009


Ulf: yes, my interface names sucked. Yours are better, though I  
believe the more accepted spelling is two T's (PuttableByKey, not  
PutableByKey).

Peter: Replies inline

On 2009/25/06, at 23:55, Peter Levart wrote:
> Considering your extension of rule 8.4.8.3 this is not always the  
> case. Anything can be returned. It depends on the static type of the  
> receiver and what that type defines as a set/put method's return type.

True, but, as the proposal states, the actual method invoked is ALWAYS  
the variant in PuttableByIndex or PuttableByKey; in other words, the  
invoked method is always the wrapper that returns void - if you do  
return something, and you use [] in the set/put context, whatever you  
return is neccessarily thrown away. It may help to imagine that this:

foo[bar] = RHS;

desugars to, after figuring out whether PuttableByIndex or  
PuttableByKey is intended:

((PuttableByIndex)foo).set(bar, RHS);

Note the cast - it ensures the expression's type is void, even if  
'foo' has a type that does return a value out of the put/set method.  
Because the API consideration of returning a value out of the put/set  
call is now no longer a part of PuttableByKey/SettableByIndex, each  
implementation that chooses to return something other than void gets  
to define their own semantics. We don't have to come up with 1  
semantic that must fit all implementations. We also preclude such a  
semantic to ever be used together with the [] assignment access, but I  
can live with that. We're still talking about, as Ruslan showed, a  
vanishingly small number of code-lines where pass-through assignment  
is even an issue.

>
> This does not apply because of the above. So I think it is important  
> that...
>

... so, it _does_ apply, and I still think the 'returns void' scenario  
is the best choice here. Nevertheless....

> >
> > foo[bar] = RHS
> >
> > will first retrofit RHS so that it 'fits' into foo (e.g. apply
> > autoboxing or unboxing), then this post-capture value is passed on  
> the
> > set/put method, and is duplicated on the stack as well for further
> > consumption.
>
> With this, everybody can be happy.
>


Yes, I admit that 'return void' appears to be a small minority here.




More information about the coin-dev mailing list