legacy code retreat's triva game : the D version
John Colvin
john.loughran.colvin at gmail.com
Sun Dec 22 03:43:51 PST 2013
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.
More information about the Digitalmars-d-announce
mailing list