----- Mail original -----
> De: "Brian Goetz" <[email protected]>
> À: "Remi Forax" <[email protected]>
> Cc: "Karen Kinnear" <[email protected]>, "valhalla-spec-experts"
> <[email protected]>
> Envoyé: Jeudi 31 Janvier 2019 17:56:47
> Objet: Re: An example of substituability test that is recursive
> Currently, `==` is almost useless on lambdas, as we disclaim nearly all
> promises. What this would mean is that `==` becomes slightly less useless and
> slightly more expensive. It’s not obvious this is a bad trade (or that it
> really matters, because people are discouraged from using `==` on lambdas
> anyway.)
>
I agree.
and it's still useless because there is no guarantee that with
Runnable r1 = () -> {};
Runnable r2 = () -> {};
r1 and r2 use the same proxy, so r1 == r2 can still return false.
I'm just saying that having recursive value types are more frequent that what i
was thinking before.
Rémi
>> On Jan 31, 2019, at 11:53 AM, Remi Forax <[email protected]> wrote:
>>
>> Thinking a little more about this example,
>> i think it will be more common if we retrofit lambdas to be value type
>> because a
>> series of composition of lambdas is a kind of linked list in term of data
>> structure in memory.
>>
>> For the composition of lambdas, a stack overflow is unlikely because
>> otherwise
>> calling the lambda will stack overflow too but it means that == will be slow
>> (because it does a recursive comparison).
>>
>> Rémi
>>
>> ----- Mail original -----
>>> De: "Remi Forax" <[email protected]>
>>> À: "Karen Kinnear" <[email protected]>
>>> Cc: "valhalla-spec-experts" <[email protected]>
>>> Envoyé: Jeudi 31 Janvier 2019 12:19:32
>>> Objet: An example of substituability test that is recursive
>>
>>> Hi Karen,
>>> here is an example that recurse to its death with the current prototype
>>>
>>> import java.lang.invoke.ValueBootstrapMethods;
>>> import java.util.stream.IntStream;
>>>
>>> public class Substituable {
>>> static value class Link {
>>> private final int value;
>>> private final Object next;
>>>
>>> public Link(int value, Object next) {
>>> this.value = value;
>>> this.next = next;
>>> }
>>>
>>> static Object times(int count) {
>>> return IntStream.range(0, count).boxed().reduce(null, (acc, index) ->
>>> new
>>> Link(index, acc), (l1, l2) -> { throw null; });
>>> }
>>> }
>>>
>>>
>>> public static void main(String[] args) {
>>> var l = Link.times(1_000);
>>>
>>> //System.out.println(l == l);
>>> System.out.println(ValueBootstrapMethods.isSubstitutable(l, l));
>>> }
>>> }
>>>
>>>
> >> Rémi