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