"it"? "#"? ""?
Brian Goetz
brian.goetz at oracle.com
Mon Nov 21 07:44:43 PST 2011
Except that's exactly what Scala does.
On 11/21/2011 10:42 AM, Matthew Adams wrote:
> I can't really predict the future response of developers using this
> feature. Your "(_,_)" example is something that I, personally, would
> never expect a compiler to figure out due to the ambiguity of using the
> same symbol in the same context.
>
> On Mon, Nov 21, 2011 at 9:39 AM, Brian Goetz <brian.goetz at oracle.com
> <mailto:brian.goetz at oracle.com>> wrote:
>
> We are not planning to add any wunderbar-like feature. However,
> Remi has pointed out an annoying hole, in that _ is currently a
> valid identifier under JLS 7, and therefore for single-argument
> lambdas, you *could* say
>
> _ -> _ + 1
>
> and the compiler would accept it -- but not for the reason you think.
>
> The likely follow-on outcome is that people will *think* we've
> adopted wunderbars, and then wonder why the "stupid" compiler won't
> accept things like
>
> (_, _) -> _ + _
>
> and probably bitch about "why did you special-case the
> single-argument wunderbar but not the general case".
>
>
>
> On 11/21/2011 10:06 AM, Matthew Adams wrote:
>
> Hi Remi,
>
> I don't understand what you're trying to say. Are you saying
> that instead
> of "it", "#" or empty string (implicit closure param), "_" could
> be used as
> an implicit closure param? If so, then Brian seems to have shot
> that down
> in his last email (no Scala wunderbars). If not, please explain
> further.
>
> -matthew
>
> On Sat, Nov 19, 2011 at 3:26 PM, Rémi Forax<forax at univ-mlv.fr
> <mailto:forax at univ-mlv.fr>> wrote:
>
> On 11/19/2011 09:45 PM, Brian Goetz wrote:
>
> We're pretty satisfied with the degree of syntax
> reduction we've
>
> achieved so far. You can make things arbitrarily compact,
> but that's not
> the goal. I don't think that horizontal span is our biggest
> problem any
> more. So don't expect any Scala-style wunderbars or
> Groovy-style it.
>
> and don't forget that even if
>
> root.listFiles(it.__lastModified()<= before);
>
>
> is not legal, this snippet is legal because '_' is a legal
> identifier
>
> root.listFiles(_ -> _.lastModified()<= before);
>
>
> Rémi
>
>
>
>
>
> On Nov 19, 2011, at 3:10 PM, John Nilsson wrote:
>
> Given that the usecase for this is about implicit
> context i really like
>
> the
>
> last option of just leaving the space before the
> period unfilled.
>
> Similarly it would be nice if it worked for all
> operators:
>
> list.filter(>2)
>
>
> BR,
> John million
> Den 19 nov 2011 00:51 skrev "Matthew
> Adams"<matthew at matthewadams.me
> <mailto:matthew at matthewadams.me>__>:
>
> NB: I'm searching through the archives on this
> and didn't see anything
> that directly addressed it.
>
> I just got through the slides at
> http://blogs.oracle.com/__briangoetz/entry/slides_from___devoxx_talk_on
> <http://blogs.oracle.com/briangoetz/entry/slides_from_devoxx_talk_on>
> and noticed a nice feature inspired by Groovy
> that was missing from the
> slide code examples. I don't know if it's
> missing from the lambda
> proposal, though -- I can't tell from the slides.
>
> Groovy defaults the name of a single closure
> argument to "it". I think
> this would be nice to have in JDK8 lambdas, too.
>
> =====
> // Without "it":
> void expire(File root, long before) {
> ...
> root.listFiles(File p -> p.lastModified()<=
> before);
> ...
> }
> =====
> // With "it":
> void expire(File root, long before) {
> ...
> root.listFiles(it.__lastModified()<= before);
> ...
> }
> ======
>
> Is this possible to include, or will the grammar
> require "->" so that
> "it.lastModified<= before" isn't interpreted by
> the compiler as a
>
> boolean
>
> expression? If that's the case, how about
> considering "#" (or some
>
> other
>
> appropriate character) instead of "it"? That
> way, the compiler would
>
> know
>
> implicitly that if it encounters a "#", it
> *must* be a lambda
>
> expression
>
> taking a single variable of an inferred type:
>
> =====
> // With "#":
> void expire(File root, long before) {
> ...
> root.listFiles(#.lastModified(__)<= before);
> ...
> }
> ======
>
> You could even reduce "it" or "#" to an empty
> string and just use the
>
> "."
>
> with no preceding scope. I don't know if the
> grammar could support
>
> it, but
>
> it's interesting. I'm not sure I like it, but
> is sure is compact!
>
> =====
> // With "":
> void expire(File root, long before) {
> ...
> root.listFiles(.lastModified()__<= before);
> ...
> }
> ======
>
> Another example:
> =====
> // explicit lambda param name
> Set<Album> favs = albums
> .filter(a -> a.tracks.anyMatch(t ->
> (t.rating>= 4)))
> .into(new HashSet<>());
> =====
> // "it"
> Set<Album> favs = albums
> .filter(it.tracks.anyMatch(it.__rating>= 4))
> // 2 its!?!?
> .into(new HashSet<>());
> =====
> // "#"
> Set<Album> favs = albums
> .filter(#.tracks.anyMatch(#.__rating>= 4))
> .into(new HashSet<>());
> =====
> // ""
> Set<Album> favs = albums
> .filter(.tracks.anyMatch(.__rating>= 4))
> .into(new HashSet<>());
> =====
>
> Thoughts?
>
> -matthew
>
> --
> @matthewadams12
> mailto:matthew at matthewadams.me
> <mailto:matthew at matthewadams.me>
> skype:matthewadams12
> yahoo:matthewadams
> aol:matthewadams12
> google-talk:matthewadams12 at __gmail.com
> <mailto:google-talk%3Amatthewadams12 at gmail.com>
> msn:matthew at matthewadams.me
> <mailto:msn%3Amatthew at matthewadams.me>
> http://matthewadams.me
> http://www.linkedin.com/in/__matthewadams
> <http://www.linkedin.com/in/matthewadams>
>
>
>
>
>
>
>
>
>
>
>
> --
> @matthewadams12
> mailto:matthew at matthewadams.me <mailto:matthew at matthewadams.me>
> skype:matthewadams12
> yahoo:matthewadams
> aol:matthewadams12
> google-talk:matthewadams12 at gmail.com
> <mailto:google-talk%3Amatthewadams12 at gmail.com>
> msn:matthew at matthewadams.me <mailto:msn%3Amatthew at matthewadams.me>
> http://matthewadams.me
> http://www.linkedin.com/in/matthewadams
>
More information about the lambda-dev
mailing list