> De: "Gavin Bierman" <gavin.bier...@oracle.com> > À: "Remi Forax" <fo...@univ-mlv.fr> > Cc: "amber-spec-experts" <amber-spec-experts@openjdk.java.net> > Envoyé: Mardi 9 Avril 2019 19:28:57 > Objet: Re: switch statement and lambda
>> On 6 Apr 2019, at 21:17, Remi Forax < [ mailto:fo...@univ-mlv.fr | >> fo...@univ-mlv.fr ] > wrote: >> Currently this code doesn't compile >> IntConsumer c = x -> switch(x) { default -> System.out.println(x); }; >> I believe it should because this is the basic pattern for supporting the >> actor >> model, >> you consume a message and do a side effect* depending on the type of the >> message, >> translated in Java, you want a lambda that takes a message as parameter, >> calls a >> switch to do the pattern matching and return void. > I understand, although this is actually to do with the way lambda expressions > are typed, rather than the switch expression. In JLS 15.27.3 "Type of a Lambda > Expression”, there is a special case: > • If the function type's result is void, the lambda body is either a statement > expression (§14.8) or a void-compatible block. > Which means that the following code typechecks: > IntConsumer ic = x -> System.out.println(x); > but it breaks as soon as we nest the statement expression, e.g. > IntConsumer ic2 = x -> true ? System.out.println(x) : System.out.println(x); > // > Compilation error: target-type for conditional expression cannot be void > This is what is happening in your example. So to deal with this we’d either > have > to make typechecking of lambdas smarter - either by replacing the typing rule > for lambdas above with something more compositional, or by making void a > first-class type, or we could perhaps add a pattern-matching form of lambda, > which has a void-aware typing rule. I’m not sure about any of these options > for > now. yes, i'm proposing to create a special case for a switch inside a lambda expression for the same reason we have a special treatment for methods. By example, this does not compile [ https://github.com/fora | https://github.com/fora ] x/loom-fiber/blob/cea7b86c26c2e86b00fb72e5098a37983e8b6441/src/main/java/fr.umlv.loom/fr/umlv/loom/actor/CounterStringActorExprSwitchDemo.java#L17 while this compiles https://github.com/forax/loom-fiber/blob/6d8a0a6ba870580d43988cd0d507d19d57653d62/src/main/java/fr.umlv.loom/fr/umlv/loom/actor/CounterStringActorExprSwitchDemo.java#L17 > Cheers, > Gavin cheers, Rémi