For me a programming language is like a painting, all the parts have to fit together to form a whole. The list and map constructors for me do not fit the Groovy painting.
Or put it in more computer science, less intuitive terms:
a) The violate the principle of least surprise in a major way (why can I "assign" an object of type Foo a List ?) b) All of these additional ways you can use lists/maps might box you in for future syntax extensions
c) They are not powerful, in the sense that you cannot say
final Foo foo = [ 123, [456, [789]] ] // [456] and [789] should also be Foo ctor call
unless you can do:
final Foo foo = [ 123, [456, [789] as Foo] as Foo ]
which imho is just terrible...

Not surprising after what I proposed, for me a good syntax for this would be:
final foo = Foo(123, Foo(456, Foo(789)))
Where foo has auto-deduced type Foo, and you can think of the "Foo" as statically imported factory methods that return Foo instances.

It is hard to imagine a more compact/concise, clearer to read way to write this, if you are coming from a C-style syntax background...
Markus


On 24.08.2017 02:35, John Wagenleitner wrote:
Just thought I'd mention list and map constructors [1], with those you can not only leave out the `new` keyword but also leave off the type (at least on the RHS)

Foo foo = ['abc']

[1] http://groovy-lang.org/semantics.html#_list_and_map_constructors

On Tue, Aug 22, 2017 at 4:16 PM, MG <mg...@arscreat.com <mailto:mg...@arscreat.com>> wrote:

    Hi Paul,

    On 21.08.2017 04:30, Paul King wrote:
    Always allow ctor calls without new keyword:


        final foo = Foo("abc") // creates a new Foo instance by
        calling Foo class ctor with signature
        Rationale: new keyword was necessary in C++ to distinguish
        heap vs stack variable allocation. No such need exists in
        Groovy, so the keyword just clutters the source code. Naming
        convention of method names being always lowercase prevents
        name clashes with methods.


     A partial solution to this is available via @Newify. As far as I
    know, @Newify hasn't been super popular, so we'd need to think
    carefully about introducing this.


    I am not surprised that the @Newify annotation
    (http://docs.groovy-lang.org/latest/html/api/groovy/lang/Newify.html
    <http://docs.groovy-lang.org/latest/html/api/groovy/lang/Newify.html>)
    is not popular: When I first read the Groovy documentation
    (somewhere around 1.8.x) and came across @Newify, I was "Yes -
    fanta... wait... you have to do what ?". It felt like a feature
    that was introduced to kill it off immediately...
    The Ruby Foo.new(...) syntax falls short for me, since it
    basically just moves the "new" String around, i.e. it does not
    make the code much more readable / compact. And for the Foo(...)
    style, you have to give the classes it shall work for explicitely
    in the @Newify, which is imho too cumbersome.

    If @Newify with Foo(...) ctor calls would work without arguments,
    one could apply it through a compiler customizer, so can you tell
    me the rationale for not going down that route (and if the
    rationale ist still valid in 2017 ;-) ), together with the cryptic
    "The annotation is intended to be used sparingly" in the @Newify doc ?

    For me, getting rid of "new" would be as Groovy as e.g. dropping
    the semicolon end of line character - which was not necessary
    since the days of K&R - or being able to give the Closure argument
    like a block construct :-)

    Now crush my hopes with some
    backward-compatibility-Groovy-insider-error-situations-handler-reason,
    Ma;-)rkus




Reply via email to