a more consistent const syntax

Reiner Pope some at address.com
Sun Aug 5 23:03:24 PDT 2007


Paul Collier wrote:
> Reiner Pope wrote:
>> Paul Collier wrote:
>>> Rioshin an'Harthen wrote:
>>>> "Chris Nicholson-Sauls" <ibisbasenji at gmail.com> kirjoitti viestissä 
>>>> news:f951kq$2fss$1 at digitalmars.com...
>>>>> Daniel919 wrote:
>>>>>> 3. const P func(P p) { ... }
>>>>>> reads like: func returns a const(P)
>>>>>
>>>>> Which is, indeed, a problem -- in that I agree.
>>>>
>>>> I agree, as well. It reads like returning a const P.
>>>>
>>>>>> const / invariant alone (without brackets) is an attribute and has 
>>>>>> no other meaning
>>>>>> further proposal: returned types in a bracket at the end:
>>>>>> 3. const func (P p) (P) { ... }
>>>>>> //templated syntax: const func!(T) (T p) (T) { ... }
>>>>>
>>>>> Uhm.  Ew.  No, seriously, I just could not possibly handle that; I 
>>>>> would keep thinking I saw templates where there aren't any.  Worse 
>>>>> yet, for a long time I'll see the '!(' and keep wondering how I 
>>>>> could be instantiating a template in that position, when its really 
>>>>> a template declaration.  T'is a naughty naughty thing to mix the 
>>>>> two -- would give both the compiler and the user headaches.  IMHO, 
>>>>> its the 'const'/'invariant' keyword on methods that needs to move 
>>>>> -- not sure where it should go, though.  What looks best down 
>>>>> here?  ;)  (First listing is the current state, for reference.)
>>>>>
>>>>> const P       vunc       (P p)       { ... }
>>>>>       P const func       (P p)       { ... }
>>>>>       P const:func       (P p)       { ... }
>>>>>       P const(func)      (P p)       { ... }
>>>>>       P       func const (P p)       { ... }
>>>>>       P       func:const (P p)       { ... }
>>>>>       P       func       (P p) const { ... }
>>>>
>>>> Definitely the last one. It's immediately familiar to anyone with a 
>>>> C++ background, which I guess most of those coming to D has, and 
>>>> which I think are the people Walter is especially targetting. It 
>>>> also has the added bonus of not complicating method declaration 
>>>> grammar too much.
>>>>
>>>> Same list, this time a const func returning a const return value:
>>>>
>>>> const const(P) func (P p)
>>>> const(P) const func (P p)
>>>> const(P) const(func) (P p)
>>>> const(P) func const (P p)
>>>> const(P) func:const (P p)
>>>> const(P) func (P p) const
>>>>
>>>> I definitely prefer the last one as the cleanest of these.
>>>
>>> Just chiming in on a slightly different note... the line that stuck 
>>> out in both examples for me was actually the const(func) line. That 
>>> seems really intuitive and consistent with the const syntax elsewhere.
>>>
>>> I do find the const-on-the-end readable too, but really mostly 
>>> because of familiarity with C++ ;)
>>
>> Although the idea is nice, I tried it out, and I don't like the look 
>> of it:
>>
>> int const(getFoo)() { return foo; }
>>
>> My main objection is that the const() is around getFoo, so you're 
>> saying that the function won't change -- but how can it, it's static 
>> data. What you really mean when you are saying it's a const function 
>> is that the this object is constant. So how about that?
>>
>> const(this) int getFoo() { return foo; }
>>
>> (It's syntactically unambiguous because this is a keyword)
>>
>>  -- Reiner
> 
> Yeah, I guess there are a lot of tradeoffs with each syntax. I was 
> wondering what the function pointers would look like as well...
> 
> const int function() p; // Current
> const(this) int function() p; // Could be confusing in a member function
> int const(function)() p; // Looks like a const function pointer
> int function() const p; // C++ style
> 
> And combinations...
> 
> const(const const(int) function(const(int))) p;
> const(const(this) const(int) function(const(int))) p;
> const(const(int) const(function)(const(int))) p;
> const(const(int) function(const(int)) const) p;
> 
> But the latter isn't really valid material for comparison. Anyways, I 
> think the bikeshed should be orange! ;)

I don't know if I'm missing something, but I thought that const 
functions *only* exist as member functions. By which I mean that only 
the following makes sense:

(supposing, for the purposes of this post, we adopt the existing C++ syntax)

class Foo
{
     int getX() const
     { return x; }
}

It doesn't make sense declare a free function const, and it doesn't make 
sense to declare a function pointer (or delegate type) const.

The reason I like my syntax (at risk of being too self-centred ;) ) is 
that it highlights exactly what a const member function is: one with the 
'this' pointer declared 'const'. I also can imagine future extensions of 
this syntax to express globally pure functions, with something like 
const(scope) or const(module). (Although they don't quite capture the 
essence of const(world) :-) )

   -- Reiner



More information about the Digitalmars-d mailing list