Interesting rant about Scala's issues

bearophile bearophileHUGS at lycos.com
Fri Apr 4 11:39:48 PDT 2014


Walter Bright:

Thank you for the answers.

> Here's one:
>
>   enum Index { A, B, C }
>   T[Index.max] array; // Error: Index.max is not an int
>   ...
>   array[B] = t;   // Error: B is not an int

In the last months I've grown a moderate desire for optionally 
strongly typed array indexes in D (as seen in Ada, but with a 
different syntax) (it's optional, so it's meant to be an additive 
change, that causes no harm to existing D code). With them code 
like yours becomes OK (as it's OK in Ada). Such optional strong 
typing for array indexes is not means for script-like D programs, 
but for the medium-integrity D programs.


> And another:
>
>   array[A + 1] = t; // Error: incompatible types Index and int

This can be solved with optionally strongly typed array indexes 
plus a succ/prec property for enums. I have asked for such 
property years ago. In Ada you use the built in function "Succ". 
Alternatively, in D you can also use a library-defined group of 
little functions/templates succ/prec/Succ/Prec (that contain a 
cast, but it's in Phobos, so it's less dangerous than a cast in 
user code):

array[Succ!(Index.A)] = t;
auto i = Index.A;
array[i.succ] = t;


> And another:
>
>   enum Mask { A=1,B=4 }
>
>   Mask m = A | B;   // Error: incompatible operator | for enum

In GitHub there is a patch that is meant to implement Flags in 
library code (in C# such Flags are almost first-class, using 
[Flags]):

https://github.com/D-Programming-Language/phobos/pull/2058

If such Flags is implemented with enums, then it contains casts, 
but again casts in Phobos are less dangerous than casts in user 
code.

Bye,
bearophile


More information about the Digitalmars-d-announce mailing list