"it"? "#"? ""?
Matthew Adams
matthew at matthewadams.me
Mon Nov 21 08:55:13 PST 2011
Yeah, I kind of figured you were going to say that after your example. My
only experience with Scala is one webinar... :)
On Mon, Nov 21, 2011 at 9:44 AM, Brian Goetz <brian.goetz at oracle.com> wrote:
> 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<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>
>>
>> <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<matthew at matthewadams.me>
>> >
>> skype:matthewadams12
>> yahoo:matthewadams
>> aol:matthewadams12
>> google-talk:matthewadams12 at __g**mail.com<http://gmail.com>
>> <mailto:google-talk%**3Amatthewadams12 at gmail.com<google-talk%253Amatthewadams12 at gmail.com>
>> >
>> msn:matthew at matthewadams.me
>> <mailto:msn%3Amatthew@**matthewadams.me<msn%253Amatthew at matthewadams.me>
>> >
>> http://matthewadams.me
>> http://www.linkedin.com/in/__**matthewadams<http://www.linkedin.com/in/__matthewadams>
>> <http://www.linkedin.com/in/**matthewadams<http://www.linkedin.com/in/matthewadams>
>> >
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> --
>> @matthewadams12
>> mailto:matthew at matthewadams.me <mailto:matthew at matthewadams.**me<matthew at matthewadams.me>
>> >
>>
>> skype:matthewadams12
>> yahoo:matthewadams
>> aol:matthewadams12
>> google-talk:matthewadams12@**gmail.com<google-talk%3Amatthewadams12 at gmail.com>
>> <mailto:google-talk%**3Amatthewadams12 at gmail.com<google-talk%253Amatthewadams12 at gmail.com>
>> >
>> msn:matthew at matthewadams.me <mailto:msn%3Amatthew@**matthewadams.me<msn%253Amatthew at matthewadams.me>
>> >
>> http://matthewadams.me
>> http://www.linkedin.com/in/**matthewadams<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