On Sunday, 22 December 2013 at 07:29:22 UTC, ilya-stromberg wrote:
On Saturday, 21 December 2013 at 20:43:27 UTC, bearophile wrote:

3) Just like the integer '5' a range of values as 0 .. 1000 is an immutable value. So a variable that scans such range should be immutable. If you really want to mutate such variable you should add a modifier like "mutable" or "mut" or something. Another common trap in D coding is iterating on an array of structs with foreach, mutating the current struct and forgetting that you are mutating only a _copy_ of the items. Unfortunately there is no mutable keyword in D, and Walter rejected all this idea. So the next best thing it to always put "immutable" at the foreach variable, unless you want to mutate it or if you can't use const/immutable for some other reason.

Why did Walter reject this idea?
BTW, we don't need `mutable` keyword to implement this idea. We should just deny any mutation of item copy. If you really need to store temporary result, add new variable. For example:

foreach(i; arr)
++i; //error - this variable contains copy of data, not a ref to the original data

   auto temp_i = i + 1; //OK

We already have similar errors, for example:

void foo()
   int i;
   i; //Error: var has no effect in expression (i)

Those are quite different. The first one does have an effect, it's just that the effect is only local to the loop scope. Even that isn't guaranteed, as ++i could have side-effects.

Reply via email to