Updated State of the Lambda

Peter Levart peter.levart at marand.si
Mon Oct 18 07:22:49 PDT 2010


On 10/18/10, Maurizio Cimadamore wrote:
> On 18/10/10 15:05, Peter Levart wrote:
> > On 10/18/10, Rémi Forax wrote:
> >    
> >>> Why could the compiler not recognise the use of (lambda) this and
> >>> provide it as an argument as you suggest?
> >>>        
> >> Because it's not the same object. If you mutate a method handle, you
> >> create a new one
> >> due to its immutable nature.
> >>
> >>      
> > Ah, now I understand your concern. You would like lambda expressions to be convertible to method handles (java.dyn.MethodHandle) as well as to SAM types.
> >
> >    
> >> MethodHandle mh = #{ MethodHandle anotherMH ->  mh == anotherMH };
> >> mh.invokeGeneric(mh) // false
> >>
> >> because, it's translated to:
> >>
> >> static boolean lambda$1(MethodHandle mh, MethodHandle anotherMH) {
> >> return mh == anotherMH;
> >> }
> >>
> >> MethodHandle mh = #lambda$1;
> >> mh = mh.bindTo(mh);
> >>
> >> mh.invokeGeneric(mh); // return mh == #lambda$1 =>  false
> >>      
> > Why couldn't compiler translate it to:
> >
> > static boolean lambda$1(MethodHandle anotherMH) {
> >    return #lambda$1 == anotherMH;
> > }
> >
> > MethodHandle mh = #lambda$1;
> >
> > mh.invokeGeneric(mh); // return #lambda$1 == #lambda$1 =>  true?
> >    
> Hi Peter,
> note that the bindTo/insertArgs solution avoids the problem that one or 
> more 'synthetic' arguments could not be available anymore when the 
> lambda expression is called (i.e. when the Sam type escapes its creation 
> context). You really want clients to just specify the arguments required 
> by the SAM method, regardless of any other synthetic arg that the 
> compiler might have inserted in the translated code.
> 
> Maurizio

I'm not suggesting to stop specifying other synthetic arguments via bindTo/insertArgs. Just the "this" Method handle argument (not called 'this' anymore) which can always be re-constructed inside the lambda method. I don't think it is possible to re-construct the same MethoHandle (by reference), but I think it's possible to reconstruct the equivalent one.

Peter

> >
> > Peter
> >
> >    
> 
> 


More information about the lambda-dev mailing list