digitalmars.D - const / in
- spir (76/76) Dec 11 2010 Hello,
Hello,
Just stepped on the const faq page at http://www.digitalmars.com/d/2.0/cons=
t-faq.html. Illuminating :-)
But I really wonder about the following topic:
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D
Why aren't function parameters const by default?
Since most (nearly all?) function parameters will not be modified, it would=
seem to make sense to make them all const by default, and one would have t=
o specifically mark as mutable those that would be changed. The problems wi=
th this are:
1. It would be a huge break from past D practice, and practice in C, C++=
2. It would require a new keyword, say mutable.
3. And worst, it would make declarations inconsistent:
void foo(int* p) {
int* q;
...
}
p points to const, and q points to mutable. This kind of inconsistenc=
y leads to all sorts of mistakes. It also makes it very hard to write gener=
ic code that deals with types.
Using in can mitigate the ugliness of having to annotate with const:
void str_replace(in char[] haystack, in char[] needle);
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D
Well, about the last note, sure: 'in', for me, just means 'const' for a par=
ameter. So that the note just translates the question to "Why aren't functi=
on parameters _in_ by default?"...
Thus, commenting the three point above:
1. Right. (But never breaking just means never progressing, and transportin=
g the same design errors from language to language forever.) D1 --> D2 was =
the right opportunity for this, esp considering the threading topic below.
2. Yes, precisely! We need _this_ keyword, not 'const' or 'in', for the rar=
e cases (?) where it makes sense to mutate a parameter or any other local v=
ariable.
3. No! Why then make local variables mutable by default?
The only case where we need to mutate a local var is in loops (accumulators=
and loop-local vars), like:
mutable int sum =3D 0;
mutable int n;
foreach (s : strings) {
n =3D to!int(s);
sum +=3D n;
}
I would be very happy with such a constness scheme. Make the right thing ea=
sy, and the special case explicit. Alternativaly, the compiler may detect v=
ars used in loops and automagically allow their mutation, which would get r=
id of 'mutable'. (Alternatively, the whole feature of loop blocks like done=
in imperative languages is a design choice. If such loop block get away, m=
utables get away as well.)
The same doc states:
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
Why does D have const?
[...]
4. Here's the biggie. Points 1..3 are insignificant in comparison. The f=
uture of programming will be multicore, multithreaded. Languages that make =
it easy to program them will supplant languages that don't. Transitive cons=
t is key to bringing D into this paradigm. The surge in use of Haskell and =
Erlang is evidence of this coming trend (the killer feature of those langua=
ges is they make it easy to do multiprogramming). C++ cannot be retrofitted=
to supporting multiprogramming in a manner that makes it accessible. D isn=
't there yet, but it will be, and transitive const will be absolutely funda=
mental to making it work.
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
Great. But this whole big thing is sadly weakened by the choice of making l=
ocals mutable by default. Else, most D funcs would so-to-say be "naturally"=
threading-friendly. And detecting unsafe ones would be (for programmers an=
d compilers as well) as difficult as noting an occurrence of 'mutable'.
Or do I miss the point?
Denis
-- -- -- -- -- -- --
vit esse estrany =E2=98=A3
spir.wikidot.com
Dec 11 2010








spir <denis.spir gmail.com>