Suggestion: shortcut for 'new X' #2

Derek Parnell derek at nomail.afraid.org
Tue Sep 5 19:07:33 PDT 2006


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();'
 
 
> 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.

-- 
Derek
(skype: derek.j.parnell)
Melbourne, Australia
"Down with mediocrity!"
6/09/2006 12:01:19 PM



More information about the Digitalmars-d mailing list