"it"? "#"? ""?

Matthew Adams matthew at matthewadams.me
Mon Nov 21 07:04:44 PST 2011


Too bad.  I really like Groovy's "it".

On Sat, Nov 19, 2011 at 2:45 PM, Brian Goetz <brian.goetz at oracle.com> 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.
>
>
>
>
> 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>:
> >
> >> 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
> >> 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
> >> skype:matthewadams12
> >> yahoo:matthewadams
> >> aol:matthewadams12
> >> google-talk:matthewadams12 at gmail.com
> >> msn:matthew at matthewadams.me
> >> http://matthewadams.me
> >> http://www.linkedin.com/in/matthewadams
> >>
> >>
> >
>
>


-- 
@matthewadams12
mailto:matthew at matthewadams.me
skype:matthewadams12
yahoo:matthewadams
aol:matthewadams12
google-talk:matthewadams12 at gmail.com
msn:matthew at matthewadams.me
http://matthewadams.me
http://www.linkedin.com/in/matthewadams


More information about the lambda-dev mailing list