----- Mail original ----- > De: "Brian Goetz" <brian.go...@oracle.com> > À: "Remi Forax" <fo...@univ-mlv.fr> > Cc: "Karen Kinnear" <karen.kinn...@oracle.com>, "valhalla-spec-experts" > <valhalla-spec-experts@openjdk.java.net> > 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 <fo...@univ-mlv.fr> 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" <fo...@univ-mlv.fr> >>> À: "Karen Kinnear" <karen.kinn...@oracle.com> >>> Cc: "valhalla-spec-experts" <valhalla-spec-experts@openjdk.java.net> >>> 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