Syntax decision

Henri Gerrits henrigerrits at yahoo.com
Wed Sep 28 08:24:11 PDT 2011


Since the cast syntax can't be touched, one way out could be to change the arg delimiters for the lambda, e.g.;

|x, y| -> x + y;

Personally, I find this a bit more readable when the lambda is provided as an argument to a method or constructor:

c.sort(|x, y| -> x > y);

instead of:

c.sort((x, y) -> x > y);

But I'm sure you will already have considered (and rejected) '|'.
 
Henri


----- Original Message -----
> From: Brian Goetz <brian.goetz at oracle.com>
> To: Howard Lovatt <howard.lovatt at gmail.com>
> Cc: "lambda-dev at openjdk.java.net" <lambda-dev at openjdk.java.net>
> Sent: Wednesday, September 28, 2011 10:41 AM
> Subject: Re: Syntax decision
> 
>T he nilary syntax is still a thorn.  But the obvious solution outlined 
> below -- allow elision of the () -- leads to a syntactic ambiguity.  If 
> -> { statement; } were a valid lambda, then is:
> 
>   (identifier) -> { statement; }
> 
> a one-arg lambda with inferred type, or a cast of a nilary lambda?
> 
> If people have brilliant other suggestions for nilary lambda syntax, 
> we'd consider it.
> 
> 
> 
> On 9/28/2011 2:03 AM, Howard Lovatt wrote:
>> Personally I am glad you have decided to go with -> since I have had
>> trouble reading Scala code, however this is not my main point in this
>> post which is have you decided if you require () for no arguments or if
>> you plan to allow a 'naked' -> e.g.:
>> 
>> shortCutAnd( -> size >= 0, -> size < max ); // Example 
> equivalent
>> to size >= 0 && size < max, but user written
>> 
>> On 28 September 2011 05:18, Brian Goetz <brian.goetz at oracle.com
>> <mailto:brian.goetz at oracle.com>> wrote:
>> 
>>     Update on syntax: the EG has chosen to stick with the -> form of the
>>     arrow that the prototype currently uses, rather than adopt the =>.
>> 
>>     You could think of this in two ways (I'm sure I'll hear both):
>> 
>>       - This is much better, as it avoids some really bad interactions with
>>     existing operators, such as:
>> 
>>         x => x.age <= 0;                // duelling arrows
>>     or
>>         Predicate p = x => x.size == 0;  // duelling equals
>> 
>>       - What a bunch of idiots we are, in that we claimed the goal of doing
>>     what other languages did, and then made gratuitous changes "just 
> for the
>>     sake of doing something different".
>> 
>>     Obviously we don't think we're idiots, but everyone can have an
>>     opinion :)
>> 
>>     In the end, this was viewed as a small tweak to avoid some undesirable
>>     interactions, while preserving the overall goal of "mostly looks 
> like
>>     what lambdas look like in other similar languages."
>> 
>> 
>> 
>>     On 9/8/2011 4:07 PM, Brian Goetz wrote:
>>       > This just in: the EG has (mostly) made a decision on syntax.
>>       >
>>       > After considering a number of alternatives, we decided to 
> essentially
>>       > adopt the C# syntax.  We may still deliberate further on the fine
>>     points
>>       > (e.g., thin arrow vs fat arrow, special nilary form, etc), and
>>     have not
>>       > yet come to a decision on method reference syntax.
>>       >
>>       > The C# syntax is:
>>       >
>>       >    lambda = ArgList Arrow Body
>>       >    ArgList = Identifier
>>       >              | "(" Identifier [ "," 
> Identifier ]* ")"
>>       >              | "(" Type Identifier [ "," Type 
> Identifier ]* ")"
>>       >    Body = Expression
>>       >              | "{" [ Statement ";" ]+ 
> "}"
>>       >
>>       > Here are some examples of lambda expressions using this syntax:
>>       >
>>       >    x =>  x + 1
>>       >    (x) =>  x + 1
>>       >    (int x) =>  x + 1
>>       >    (int x, int y) =>  x + y
>>       >    (x, y) =>  x + y
>>       >    (x, y) =>  { System.out.printf("%d + %d = %d%n", 
> x, y, x+y); }
>>       >    () =>  { System.out.println("I am a Runnable"); }
>>       >
>>       > The decision to choose this syntax was twofold:
>>       >    - The syntax scores "pretty well" on most subjective 
> measures
>>     (though
>>       > has cases where it looks bad, just like all the others do).  In
>>       > particular, it does well with "small" lambdas that are 
> used as method
>>       > arguments (a common case), and also does well with large
>>       > (multi-statement) lambdas.
>>       >
>>       >    - Despite extensive searching, there was no clear winner among 
> the
>>       > alternatives (each form had some good aspects and some really not
>>     very
>>       > good aspects, and there was no form that was clearly better than 
> the
>>       > others).  So, we felt that it was better to choose something that 
> has
>>       > already been shown to work well in the two languages that are
>>     most like
>>       > Java -- C# and Scala -- rather than to invent something new.
>>       >
>>       > A compiler implementation should be available soon.
>>       >
>>       >
>>       >
>> 
>> 
>> 
>> 
>> --
>>     -- Howard.
>> 
>


More information about the lambda-dev mailing list