Switch: Case Range Syntax

Marco Leise Marco.Leise at gmx.de
Thu Aug 18 20:16:15 PDT 2011


Am 17.08.2011, 21:49 Uhr, schrieb simendsjo <simendsjo at gmail.com>:

> On 17.08.2011 21:35, Jacob Carlborg wrote:
>> On 2011-08-17 19:48, Jonathan M Davis wrote:
>>> On Wednesday, August 17, 2011 10:27 Vijay Nayar wrote:
>>>> D adds a very handy feature that allows you to check for a range of
>>>> values in a single case. Is there a particular reason that the syntax
>>>> "case<start>: .. case<end>:" is used instead of treating the case
>>>> statement similarly to an array slice, e.g. "case<start> ..<end>:"?
>>>>
>>>> For example:
>>>>
>>>> import std.stdio;
>>>>
>>>> void main() {
>>>> int bob = 12;
>>>> switch (bob) {
>>>> // Why not "case 0 .. 9:"?
>>>> case 0: .. case 9:
>>>> writeln("Less than 10.");
>>>> case 10: .. case 19:
>>>> writeln("Less than 20.");
>>>> case 20: .. case 29:
>>>> writeln("Less than 30.");
>>>> break;
>>>> default:
>>>> break;
>>>> }
>>>> // Output: Less than 20. Less than 30.
>>>> }
>>>
>>> I don't know, but ranged case statements don't have the same semantics  
>>> as
>>> giving a range of values when slicing or to a foreach loop, so that
>>> may be
>>> why.
>>>
>>> arr[0 .. 10]
>>>
>>> does _not_ include the element at index 10.
>>>
>>> case 0: case 10:
>>>
>>> _does_ include 10. So, it actually probably be a bad thing for them to
>>> use the
>>> same syntax. To use the same syntax for both would make the semantics
>>> of that
>>> syntax inconsistent and confusing.
>>>
>>> - Jonathan M Davis
>>
>> D should have a built-in range type. One that supports syntax for both
>> including and excluding the last element:
>>
>> auto a = 3 .. 5
>> auto b = 3 ... 5
>>
>> Then we wouldn't need a special range syntax for switch statements. You
>> could store ranges in variables and pass them to functions. opSlice
>> probably wouldn't be needed, instead opIndex could be used and you would
>> declare the method to take a range instead of two integers.
>>
>
> int a = 3 .. 5;
> No need to have run-time assertions for >= 3 && <= 5
> Don't we all like compile-time errors?

Delphi uses ranges in a way similar to declaring an enum:
     type TDigit = 0 .. 9;
You can then use that in a set, which translates to a Phobos "BitArray":
     type TDigitSet = set of TDigit;
This is now a type that is at least 10 bit long and the usual set  
operations apply. I liked it to declare types that restrict the set of  
available values, like a byte but only with the numbers 0 to 100  
available. I think it could work like the range checks on arrays.
But we are going off-topic here :p


More information about the Digitalmars-d mailing list