support for 'var' in lambda parameters
Remi Forax
forax at univ-mlv.fr
Sat Dec 23 14:27:39 UTC 2017
jdk 10 is in rampdown phase 1 [1], so bugs can be fixed but no new feature can be added.
I suppose JEP 323 will be targeted to jdk 11.
cheers,
Rémi
[1] http://openjdk.java.net/projects/jdk/10/
----- Mail original -----
> De: "Zheka Kozlov" <orionllmain at gmail.com>
> À: "Maurizio Cimadamore" <maurizio.cimadamore at oracle.com>
> Cc: "amber-dev" <amber-dev at openjdk.java.net>
> Envoyé: Samedi 23 Décembre 2017 08:02:53
> Objet: Re: support for 'var' in lambda parameters
> JEP-323 has no target release. Does it mean we will not get `var` in
> lambdas in Java 10?
>
> 2017-12-22 4:00 GMT+07:00 Maurizio Cimadamore <
> maurizio.cimadamore at oracle.com>:
>
>>
>>
>> On 17/12/17 21:00, Maurizio Cimadamore wrote:
>>
>>> Hi,
>>> the support for var in lambdas is only in the amber repository (lvti
>>> branch). For JDK 10 we have targeted the more mature part of the lvti
>>> branch.
>>>
>>> But stay tuned, as we might have more news soon ;-)
>>>
>> And, as you might have noticed - here's the news:
>>
>> http://openjdk.java.net/jeps/323
>>
>>
>> Cheers
>> Maurizio
>>
>>> And thanks for trying out the feature - it is true that, if you want
>>> annotations, modifiers (such as final), you are currently restricted to use
>>> explicit parameter declaration, which in certain cases might be
>>> inconvenient if the types involved are big.
>>>
>>> Cheers
>>> Maurizio
>>>
>>>
>>> On 17/12/17 06:48, Zheka Kozlov wrote:
>>>
>>>> I just downloaded the latest JDK (10-ea+36) and I cannot use `var` in
>>>> lambdas. Was this rejected? I now find this feature really useful because I
>>>> often want to write `(final var p) -> ...` instead of `(final
>>>> VeryLongTypeName p) -> ...`
>>>>
>>>> 2017-09-27 19:47 GMT+07:00 Maurizio Cimadamore <
>>>> maurizio.cimadamore at oracle.com <mailto:maurizio.cimadamore at oracle.com>>:
>>>>
>>>>
>>>>
>>>> On 27/09/17 13:20, Zheka Kozlov wrote:
>>>>
>>>>> Why should we allow `var` in lambda parameters? Who will ever
>>>>> need writing `(var x) -> x` instead of `x -> x`?
>>>>>
>>>> Hi,
>>>> first of all, to clarify things, this is an experimental feature -
>>>> which is why it was left out from the JEP 286 integration into
>>>> jdk10/master.
>>>>
>>>> Secondly, JEP 286 is not just about 'var' in local variable
>>>> declaration (although I agree that's the most frequent use case).
>>>> You can also use 'var' in other places too, such as for loops and
>>>> try-with-resources. From an uniformity perspective, one could
>>>> argue that lambda parameters are another place where the 'var'
>>>> treatment could be applied.
>>>>
>>>> As you point out, lambdas do provide a more succint version to
>>>> declare implicit parameters - but in a language that is evolving
>>>> to use 'var' in more places (pattern matching will likely use
>>>> 'var' for pattern bindings), I think that, from a pedagogical
>>>> question at least, it makes sense to allow 'var' in all places
>>>> where you want to declare a variable but you don't care about
>>>> giving it an explicit type.
>>>>
>>>> Maurizio
>>>>
>>>>
>>>>> 2017-09-27 19:07 GMT+07:00 Maurizio Cimadamore
>>>>> <maurizio.cimadamore at oracle.com
>>>>> <mailto:maurizio.cimadamore at oracle.com>>:
>>>>>
>>>>>
>>>>> Hi,
>>>>> I've recently pushed a changeset [1] to enable use of 'var'
>>>>> in lambda parameters. Below is some rationale on the
>>>>> implemented support.
>>>>>
>>>>> In the current (e.g. JDK 9) grammar, we have two versions of
>>>>> lambdas: *implicitly*- and *explicitly*-typed. Furthermore,
>>>>> an implicitly typed lambda can come in two form (there's no
>>>>> terminology for it, so I'll make up one): *compact* and
>>>>> *parenthesized*.
>>>>>
>>>>> Let's see some examples:
>>>>>
>>>>> x->x //implicit, compact
>>>>> (x)->x //implicit, parenthesized
>>>>> (String x)->x //explicit
>>>>>
>>>>> So, the first question is - when is it ok to use `var`? There
>>>>> are two choices here:
>>>>>
>>>>> 1. allow `var` on all implicit lambdas
>>>>> 2. allow `var` only on implicit parenthesized lambdas
>>>>>
>>>>>
>>>>> We concluded that (2) is the option that makes more sense -
>>>>> this allows for a smooth verbosity curve (see below from most
>>>>> compact to least compact):
>>>>>
>>>>> x->x
>>>>> (x)->x //added parens
>>>>> (var x)->x //added 'var'
>>>>> (String x)->x //ok, fully typed
>>>>>
>>>>> Second question: we basically have now two kind of implicitly
>>>>> typed parameters - those that omit type info in full (e.g.
>>>>> the formal decl is just an identifier) and those using `var`.
>>>>> Can we mix and match between these e.g.
>>>>>
>>>>> (var x, y)->x+y
>>>>>
>>>>> We have concluded that there's no need to mix and match. In
>>>>> fact, it is more likely that one form of implicit parameter
>>>>> declaration will supplant the other in the long run.
>>>>>
>>>>> Third question: what about parameter modifiers such as
>>>>> `final` and/or annotations? Historically, such modifiers were
>>>>> not allowed in implicit lambda parameters (as those were just
>>>>> identifiers, and it poses several parser challenges to e.g.
>>>>> allow annotations there); on the other hand, local variables
>>>>> using `var` support both modifiers and annotations. We
>>>>> concluded that, for consistency, we have to do the same when
>>>>> `var` occurs in a lambda parameter.
>>>>>
>>>>> Last question: can I mix implicit an explicit parameters?
>>>>>
>>>>> (var x, String y)-> x + y
>>>>>
>>>>> While that would be nice, it must be noted that this is a
>>>>> much deeper change, with ramifications in overload selection,
>>>>> since implicit and explicit lambdas are currently two
>>>>> disjoint sets, with very different behavior w.r.t. overload
>>>>> resolution (see definitions of 'pertinent to applicability'
>>>>> in JLS 15.12.2.2). For that reason, we won't go down there
>>>>> now (but it's something worth considering in the future).
>>>>>
>>>>> Maurizio
>>>>>
>>>>> [1] -
>>>>> http://mail.openjdk.java.net/pipermail/amber-dev/2017-Septem
>>>>> ber/002138.html
>>>>> <http://mail.openjdk.java.net/pipermail/amber-dev/2017-Septe
>>>>> mber/002138.html>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>
More information about the amber-dev
mailing list