Syntax decision

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Mon Oct 3 04:11:33 PDT 2011


On 28/09/11 16:24, Henri Gerrits wrote:
> 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;
Note that a Ruby-like syntax using '|' as parameters delimiter is 
probably not gonna fly should we add support for union types (as the 
current prototype does):

|List<A|B>|-> ...

makes it very awkward to read.

Maurizio
> 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