a more consistent const syntax

Chris Nicholson-Sauls ibisbasenji at gmail.com
Sun Aug 5 10:33:04 PDT 2007


Daniel919 wrote:
> I've got some ideas about how to make the const syntax more
> consistent.
> First I will show you the current situation.
> Then I will list the confusions and possible solutions.
> 
> Some days ago I already mentioned my first idea on IRC, but got no replies.
> Also I know that you, Walter, hardly don't change features, which
> already have been implemented.
> And my suggestions would require this of course.
> 
> The "define proposal" is not such a big change in the language,
> in opposite to the much more important idea about
> "putting the return type in a bracket at the end".
> Because this is what the last idea requires, it's written after "WAIT:".
> 
> Nevertheless I will give it a try, because 2.0 is still alpha and it 
> will break code compatibility anyway.
> 
> 
> 
> currently the keyword const(/invariant) has three meanings:
> -----------------------------------------------------------
> 1. alone: const x = 1; compile-time variable (not an lvalue)

Well technically if that was what I wanted, I'd use one of 'invariant x 
= 1;' or a more explicit 'final invariant(int) x = 1;'.

> 2. with(): const(P) p = new Point(1,2); run-time object, which is 
> protected from changes

Well, protected from changes via this reference... but yeah.  I'd say 
the 'const(type)' case would/should be used most often anyhow.

> 3. alone: const P func(P p) { writefln(p.x, " ", p.y); }; attribute for 
> a member function: the function can't change any class fields

#3 is an issue, in my book.  Not a massive one, but its there.  We'll 
get into that one below.

> 
> confusions and solutions:
> -------------------------
> #1
> 1. const x = 1;
> 2. const(P) p = new Point(1,2);
> you see const first and later recognize the brackets
> one would not expect brackets to lead to a completely different meaning 
> of the forrun keyword

My eyes are trained to spot them... still yes, a sudden shift in meaning 
can be counter-intuitive.  Although its not entirely a shift...  you 
could probably think of 'const x = 1;' as shorthand for 'final 
const(int) x = 1;'.

> 1. define x = 1;
> 2. const(P) p = new Point(1,2);
> can't be confused anymore, different keywords
> define defines a compile-time variable
> const / invariant has nothing to do with compile-time anymore. it only 
> means protection

Adding new keywords is usually the absolute last option around here. 
(There was talk ages past of replacing 'auto x = 1' with 'let x = 1'.)

> 
> #2
> 3. const P func(P p) { ... }
> reads like: func returns a const(P)

Which is, indeed, a problem -- in that I agree.

> 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 { ... }

> 
> #3
> 1. same meaning: invariant x = 1; const x = 1;

For basic types, there often isn't much difference anyhow.  Except that 
invariant members of structures allocate no memory in the structure, for 
example.

> not allowed anymore: const(/invariant) alone is an attribute, instead use:
> 1. define x = 1;
> 
> #4
> //this is ok: final int x = 1; const(int)* xptr = &x; // but:
> 2. const(int) x = 1;
> this is nonsense and also atm it could be confused with:
> 1. const int x = 1;
> 
> the compiler should issue at least a warning, and instead you should use:
> 1. define x = 1;
> 
> 
> #5
> void func(const P p) { typeof(p) == const(P) }
> bad, because one could expect this to be also valid then:
> const P p = new P(1,2); //but fails of course
> correctly is has to be:
> void func(const(P) p) { ... }
> void func(ref const(P) p) { p = new P(3,4); } //OK
> //void func(const(int) i) { ... } //const(int) nonsense (see #4)
> //void func(ref const(int) i) { ... } //const(int) nonsense (see #4)
> 
> compiler should issue an error
> const(/invariant) alone is an attribute
> 
> 
> WAIT:
> -----
> because we have another syntax for compile-time variables now,
> we could say that:
> const P** ptr2ptr2P means:
> const(P**) ptr2ptr2P
> in this case, #5 would be allowed
> but this would also require #2 further proposal to be implemented, 
> because if it wasn't:
> const P** func() { ... }
> would not only be confused with, but it would be THE SAME as:
> const(P**) func() { ... }
> then the correct form would have to be:
> const func() (const P**) { ...}
> 
> note that #4 would be true for: const int x = 1; then
> this would be nonsense, because it would be the same as: const(int) x = 1;
> so the compiler should issue at least a warning
> 
> 
> 
> PS: Having the return types in a bracket at the end, would make it
> possible to implement multiple return values / return tuples
> in a consistent way, too.
> It would also allow more tricks, like returning local values of a 
> function, avoiding ref, etc etc ...
> 
> 
> 
> I would really enjoy to get some replies (especially yours, Walter),
> even if it's just a: "No that's totally stupid" ;)
> 
> Best regards,
> Daniel

No that's totally stupid.



Ahh I'm just kidding.  At least you're thinking about the situation and 
offering suggestions.  (And welcome to the tiny militia of 'const R 
func()' syntax detractors. ;))  The final/const/invariant system needs 
some good hammering yet -- although its off to a lovely start, danke Walter.

-- Chris Nicholson-Sauls



More information about the Digitalmars-d mailing list