digitalmars.D - Wouldn't it be nice (case range statements)
- John Colvin (20/20) Oct 14 2014 if code like this worked: http://dpaste.dzfl.pl/7ea4eb03f02e
- Adam D. Ruppe (21/27) Oct 14 2014 It comes from writing:
- John Colvin (2/31) Oct 15 2014
- Andrei Alexandrescu (2/21) Oct 14 2014 The short answer is it's all good as it is. -- Andrei
- eles (4/10) Oct 15 2014 Actually, the latter is the reason for the former. If incluseve
if code like this worked: http://dpaste.dzfl.pl/7ea4eb03f02e A few reasons why it doesn't: You have to duplicate the case keyword when declaring case ranges. Why? Case ranges are inclusive at both ends of the range, unlike in foreach. Again, why? exponential notation (e.g. `2e9`) returns a double, not a long. The exponential notation isn't really a problem, declaring some enums `enum i2e9 = cast(long)2e9;` deals with it fine. The case ranges are a wart though. Solution: Allow the second `case` keyword to be removed, which would then have the same semantics as the range in foreach. E.g. case 0 .. 4: // matches 0,1,2,3 case 0: .. case 4: // matches 0,1,2,3,4 No breakage, greater consistency, neater code, good stuff. At least as good as pascal. Even better, the .. operator would become general (overloadable, too) and the case range would just be a special case of it.
Oct 14 2014
On Tuesday, 14 October 2014 at 21:29:59 UTC, John Colvin wrote:You have to duplicate the case keyword when declaring case ranges. Why? Case ranges are inclusive at both ends of the range, unlike in foreach. Again, why?It comes from writing: switch(foo) { case 1: case 2: case 3: case 4: // code } Then just replacing the case 2 and case 3 with .. collapsing the repetition to just the beginning and the end. If you write it as: switch(foo) { case 1: .. case 4: // code } vertically, that is, I think the rationale becomes a lot more clear. I like this a lot, it works brilliantly for me and makes good sense.Allow the second `case` keyword to be removed, which would then have the same semantics as the range in foreach.That would be ok too.
Oct 14 2014
On Tuesday, 14 October 2014 at 21:33:36 UTC, Adam D. Ruppe wrote:On Tuesday, 14 October 2014 at 21:29:59 UTC, John Colvin wrote:Ah, yeah, that does make sense.You have to duplicate the case keyword when declaring case ranges. Why? Case ranges are inclusive at both ends of the range, unlike in foreach. Again, why?It comes from writing: switch(foo) { case 1: case 2: case 3: case 4: // code } Then just replacing the case 2 and case 3 with .. collapsing the repetition to just the beginning and the end. If you write it as: switch(foo) { case 1: .. case 4: // code } vertically, that is, I think the rationale becomes a lot more clear. I like this a lot, it works brilliantly for me and makes good sense.Allow the second `case` keyword to be removed, which would then have the same semantics as the range in foreach.That would be ok too.
Oct 15 2014
On 10/14/14, 2:29 PM, John Colvin wrote:if code like this worked: http://dpaste.dzfl.pl/7ea4eb03f02e A few reasons why it doesn't: You have to duplicate the case keyword when declaring case ranges. Why? Case ranges are inclusive at both ends of the range, unlike in foreach. Again, why? exponential notation (e.g. `2e9`) returns a double, not a long. The exponential notation isn't really a problem, declaring some enums `enum i2e9 = cast(long)2e9;` deals with it fine. The case ranges are a wart though. Solution: Allow the second `case` keyword to be removed, which would then have the same semantics as the range in foreach. E.g. case 0 .. 4: // matches 0,1,2,3 case 0: .. case 4: // matches 0,1,2,3,4 No breakage, greater consistency, neater code, good stuff. At least as good as pascal. Even better, the .. operator would become general (overloadable, too) and the case range would just be a special case of it.The short answer is it's all good as it is. -- Andrei
Oct 14 2014
On Tuesday, 14 October 2014 at 21:29:59 UTC, John Colvin wrote:if code like this worked: http://dpaste.dzfl.pl/7ea4eb03f02e A few reasons why it doesn't: You have to duplicate the case keyword when declaring case ranges. Why? Case ranges are inclusive at both ends of the range, unlike in foreach. Again, why?Actually, the latter is the reason for the former. If incluseve ranges were defined (let's say with ...), then that becomes possible.
Oct 15 2014