Syntax decision

Ali Ebrahimi ali.ebrahimi1781 at gmail.com
Wed Sep 28 08:19:09 PDT 2011


Hi,
And another way:

m((T)(-> { ... }));

Best Regards,
Ali Ebrahimi

On Wed, Sep 28, 2011 at 6:44 PM, Maurizio Cimadamore <
maurizio.cimadamore at oracle.com> wrote:

> On 28/09/11 15:58, Ali Ebrahimi wrote:
>
>> Hi,
>> I think with great support for type inference the need for casting lambas
>> (unless for disambiguating overloaded methods,... ) would be low.
>> And this ambiguity can be solved by applying some precedence in favor of
>> lambdas or versa.
>>
> But, if you have something like:
>
> m((T)-> { ... });
>
> and you want it to be a nilary lambda converted to some target type T, how
> do you do that? If you exploit precedence as per your suggestion, this will
> always be a one-ary lambda.
>
> Of course, one way out would be to disambiguate using '()', as in:
>
> m((T)()-> { ... });
>
> Is the cure worse than the disease? I guess it depends on the frequency of
> nilary lambdas and how often do you need an explicit target type (as you
> pointed out, this is closely related to how well inference performs).
>
> Maurizio
>
>  Best Regards.
>>
>> On Wed, Sep 28, 2011 at 6:11 PM, Brian Goetz<brian.goetz at oracle.com>
>>  wrote:
>>
>>  The 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