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