const question/suggestion

Bill Baxter dnewsgroup at billbaxter.com
Tue Jun 19 14:24:51 PDT 2007


Chris Nicholson-Sauls wrote:
> Kristian Kilpi wrote:
>> On Tue, 19 Jun 2007 00:55:21 +0300, Walter Bright 
>> <newshound1 at digitalmars.com> wrote:
>>
>>> Myron Alexander wrote:
>>>> const var = new SomeObject ();
>>>
>>> The above line will fail because const declarations can only be 
>>> initialized with something that can be evaluated at compile time. The 
>>> example should be:
>>>
>>>     const(SomeObject) var = new SomeObject();
>>>
>>>> var.changesomething() -- fails
>>
>> Now I'm a bit confused... Oh, now I get it. (I hope.)
>> There can be constant views and constant, or literal, data. And 
>> literals are, of course, compile time, er, constants.
>>
>> Sometimes 'const' means immutable and sometimes it means literal, 
>> compile time value...
>>
>>
>> At first I read:
>>
>>   const foo = new Bar;  //or const Bar foo = new Bar;
>>
>> as:
>>
>>   final const(Bar) foo = new Bar;
>>
>> That is, a final, constant view to an object (or, immutable reference 
>> (final variable) + immutable object (constant view).) Not as a 
>> constant view to a constant/literal object.
>>
>> With value types, final will be sufficient:
>>
>>   final int v = foo();
>>
>> But with reference types, one must write "final const(...)"...? Uh, 
>> that's verbose. :/
>>
>>
>> With functions, you can write:
>>
>>   void f(const Bar foo);
>>
>>   f(new Bar);  //no need for compile time constant/literal
>>
>> Ok, inside the function, 'foo' will be treated as a constant/literal, 
>> so it makes sense, kind of.
>> (And const-by-default function paramters are too inconsistent?... ;) )
>>
>>
>>
>> Maybe I should also wonder this: how one can create an object that 
>> will be treated as invariant/constant?
>>
>>   invariant Bar foo = new Bar;  //global variable; currently inline 
>> initialization not allowed though
>>
>>   void f() {
>>     invariant obj = foo;
>>   }
>>
>> Surely the object pointed by 'foo' will be invariant during the 
>> execution of the program.
> 
> It has already been mentioned that you can 'cast(const) new Foo' to make 
> it be treated as such (since you've cast it immediately upon creation, 
> so there's no mutable referance available).  Likewise with 
> 'cast(invariant)'.  I'm thinking these might be relatively common 
> operations for some, so maybe it would be wise/better/convenient to 
> allow these keywords between 'new' and 'Foo' like 'new const Foo'.  If 
> nothing else, it reads well to me, and provides type deduction.
> 
> auto  mvar = new           Foo ; //                 Foo  mvar ;
> auto  cvar = new const     Foo ; //       const    (Foo) cvar ;
> auto  ivar = new invariant Foo ; //       invariant(Foo) ivar ;
> final fvar = new const     Foo ; // final const    (Foo) fvar ;
> 
> -- Chris Nicholson-Sauls

I would prefer something like that.  I still can't get over the feeling 
anytime I type or see "cast" that I'm doing something dangerous and 
subversive.  Although I know things like cast(ClassType) in D are 
actually safe casts... but even using safe casts like that is kind of a 
warning sign in OO code that you may have factored your interface 
incorrectly.

--bb



More information about the Digitalmars-d-announce mailing list