recursive lambdas

Aleksey Shipilev aleksey.shipilev at oracle.com
Mon Sep 24 07:50:42 PDT 2012


Let me be more clear. As I understand the spec prohibits this:

   void test() {
      IntUnaryOperator fib =
          (n) -> (n < 2) ? 1 : fib.operate(n - 1) + fib.operate(n - 2);
   }

...but still allows this (still a recursive lambda):

   public IntUnaryOperator fib =
         (n) -> (n < 2) ? 1 : fib.operate(n - 1) + fib.operate(n - 2);

...because the current JLS does not prohibit this. Also, the plain old
inner classes work as well:

    public IntUnaryOperator fib =
            new IntUnaryOperator() {
                @Override
                public int operate(int n) {
                    return (n < 2) ? 1 :
                         fib.operate(n - 1) + fib.operate(n - 2);
                }
            };

    public interface IntUnaryOperator {
        int operate(int v);
    }


Am I correct?

Thanks,
Aleksey.

On 09/24/2012 06:28 PM, Brian Goetz wrote:
> We decided to disallow this form for the time being, in part to simplify
> the metafactory protocol and therefore increase the chance of
> intrinsification of lambda capture sites.
> 
> On 9/24/2012 10:01 AM, Aleksey Shipilev wrote:
>> Hi guys,
>>
>> What is our current stance on recursive lambdas? I.e. should this code
>> considered to be correct?
>>
>>      public static IntUnaryOperator fib =
>>         (n) -> (n < 2) ? 1 : fib.operate(n - 1) + fib.operate(n - 2);
>>
>> The current EDR spec says nothing about this, except for "Remove support
>> for recursive lambdas" in the changelog, but both latest public b56 and
>> the nightly binary builds of lambda/lambda forest in OpenJDK do accept
>> this as the correct code.
>>
>> The reason I ask is that I keep bugging IDEA guys about their lambda
>> support, fixing a bug here, there, and everywhere, as this helps people
>> to start hacking on lambdas and provide the useful feedback:
>>     http://youtrack.jetbrains.com/issue/IDEA-91986
>>
>> I think everyone realizes the spec is in flux, but it is important to
>> understand what are we leaning towards.
>>
>> Thanks,
>> Aleksey
>>



More information about the lambda-libs-spec-observers mailing list