Suggestion: shortcut for 'new X' #2

Kristian kjkilpi at gmail.com
Wed Sep 6 02:30:18 PDT 2006


On Wed, 06 Sep 2006 05:07:33 +0300, Derek Parnell  
<derek at nomail.afraid.org> wrote:

> On Wed, 06 Sep 2006 02:20:01 +0200, Ivan Senji wrote:
>
>> Derek Parnell wrote:
>>> On Tue, 05 Sep 2006 20:35:13 +0200, Ivan Senji wrote:
>>>
>>>> Kristian wrote:
>>>>> Ok, I think my previous suggestion for an optional shortcut was a bit
>>>>> too strange... For example:
>>>>>
>>>>> Foo f = new Foo;
>>>>> Bar b = new Bar(10);
>>>>>
>>>>> <->
>>>>>
>>>>> Foo f = new;
>>>>> Bar b = new(10);
>>>>>
>>>>> Now there has been a proposal of the following (I use 'local' keyword
>>>>> here):
>>>>>
>>>>> Foo f1 = local Foo;  //stack/RAII
>>>>> Foo f2 = new Foo;    //heap
>>>>>
>>>>> I like the syntax also.
>>>>>
>>>>> How about if you could *alternately* write:
>>>>>
>>>>> local Foo f1;
>>>>> new Foo f2;
>>>>>
>>>>> This would take care of the redundant class name in the declarations.
>>>>>
>>>>> (I just hate redundance! ;) Writing class names twice is frustrating;
>>>>> there is a pattern of "X ... X".)
>>>>>
>>>>> Constructor parameters are put after variable names:
>>>>>
>>>>> local Bar b(10);
>>>>> new Bar b(10, true);
>>>>>
>>>>> If this (or something similar) is not possible, a lot of people
>>>>> (including me) could end writing auto typed declarations. For example
>>>>> (auto here means auto type, not RAII):
>>>>>
>>>>> auto f = new Foo;
>>>>> auto b = new Bar(10);
>>>> And I still don't see what is so terribly awful about that?
>>>>
>>>>> That could be shortened to:
>>>>>
>>>>> f = new Foo;
>>>>> b = new Bar(10);
>>>>>
>>>>> Which leads to my suggestion:
>>>>>
>>>>> new Foo f;
>>>>> new Bar b(10);
>>>> Hmm, that looks a little to strange to me. It looks more like an
>>>> expression than a declaration.
>>>
>>> The suggestion looks good to me. I see the same form ...
>>>
>>>  static int a;
>>>  new    Foo b;
>>>
>>> so to generalize ...
>>>
>>> DATADECLARATION ::   [STORAGECLASS] TYPE IDENTIFIER [ARGUMENTS]
>>>
>>>          int   a;
>>>   new    Foo   b;
>>>   local  Bar   c;
>>>   static float e;
>>>
>>
>> OK, now I know why it looked strange.. :)
>>
>> Class references when normally created would be null, and you have to
>> assign something to them for them to be something other than null.
>>
>> And with this syntax there is explicit assignment :)
>
> Good point. But there doesn't have to be an assignment. For example...
>
>   local Foo a;   // Creates a null Foo object reference
>   new   Foo b;   // Also creates a null Foo object reference
>
>   local Foo c();   // Creates a Foo object reference and object instance
>                    // on the stack with the dtor called when leaving  
> scope.
>   new   Foo d();   // Creates a null Foo object reference and object
>                    // instance on heap with no guaranteed dtor call.
>                    // This is a shorthand for 'Foo d = new Foo();'

If you like that it would be possible to create null object references  
with this syntax, I think I can live with the extra parenthesis when  
creating object instances... ;)

The compiler could then do the following checks:

local Foo a;
new   Foo b;

a = local Foo;  //ok
a = new Foo;    //error

b = local Foo;  //error
b = new Foo;    //ok


>> But is a bigger problem maybe that there are going to be too many ways
>> to write the same thing?
>>
>> Foo b = new Foo;
>> auto b = new Foo;
>> new Foo b;
>
> Maybe, but we don't have a way to do 'auto auto ...' yet.
>

I don't think this is a big problem because variable declaration is a  
simple thing, easy to read and understand. It's a matter of being  
consistent.

And if 'local' and 'new' here are treaded as storage classes (i.e. "local  
Foo a;" creates a null object reference) and the parenthesis syntax is a  
shortcut notation (i.e. "local Foo a();" creates an object reference and  
an object instance), then we have:

Foo a;            //a = null
local Foo b;      //b = null
local Bar c(10);  //c = local Bar(10)



Hmm, what if you could put all the init values inside parenthesis...? For  
example:

int a(5);   //== "int a = 5;"
Bar b(10);  //== "Bar b = new Bar(10);"

Well, I am not sure if I like it. It makes "a(5)" to look like a class  
object with a constructor... but one could think that an initialization is  
a some kind of constructor... I have to think about it. Comments?



More information about the Digitalmars-d mailing list