Thread overview | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
January 19, 2003 switch statement | ||||
---|---|---|---|---|
| ||||
I just encountered D today for the first time. In some ways I am impressed. I have been a C++ user for some years now. I always felt it should have made a cleaner break from legacy C. The C struct tag nonsense goes away in D -- excellent. The C pre-processor and .H files go away -- also excellent. Etc. But I am concerned that an opportunity has not been taken to improve on the C and C++ switch statement, which appears to have survived intact. In my experience the absence of a break statement within the body of a switch statement, such that it is possible to fall through into the next case, is typically a mistake. If I were to do this, I would always add a "// FALL THRU" comment to assist in maintenance by making the intention clear. Since, in my experience, a well-written switch statement tends to avoid falling through, it would make a lot of sense to me if it were illegal to fall through, thus rendering explicit break statements unnecessary, and allowing them instead to cause break-out from an enclosing loop if there is one. For several years now I have been using a language called Smallworld Magik which was developed about the same time as Python and has considerable similarities though done entirely independently. In Magik as in Python there is no such thing as falling through and yet programmers survive. In Magik there is no goto and yet the company I work for has a base of millions of lines of code that has been happily written without it. Surely eliminating the goto and tightening up the switch statement would be good to do in D? "A mechanism of world inter-communication will be devised, embracing the whole planet, freed from national hindrances and restrictions, and functioning with marvellous swiftness...." -- Shoghi Effendi -- The Unfoldment of World Civilisation -- 11 Mar 1936 |
January 20, 2003 Re: switch statement | ||||
---|---|---|---|---|
| ||||
Posted in reply to Paul Conway | Paul Conway wrote: > I just encountered D today for the first time. In some ways I am impressed. I > have been a C++ user for some years now. I always felt it should have made a > cleaner break from legacy C. The C struct tag nonsense goes away in D -- > excellent. The C pre-processor and .H files go away -- also excellent. Etc. > > But I am concerned that an opportunity has not been taken to improve on the C > and C++ switch statement, which appears to have survived intact. In my > experience the absence of a break statement within the body of a switch > statement, such that it is possible to fall through into the next case, is > typically a mistake. If I were to do this, I would always add a "// FALL THRU" > comment to assist in maintenance by making the intention clear. Since, in my > experience, a well-written switch statement tends to avoid falling through, it > would make a lot of sense to me if it were illegal to fall through, thus > rendering explicit break statements unnecessary, and allowing them instead to > cause break-out from an enclosing loop if there is one. I have seen a lot of wonderful uses for a fall-through switch statement, which don't hamper the legibility, but improve it. Anyway, it has to be possible to fall through on switch somehow. Maybe a warning at fallthrough, which can be shut off somehow? > For several years now I have been using a language called Smallworld Magik which > was developed about the same time as Python and has considerable similarities > though done entirely independently. In Magik as in Python there is no such thing > as falling through and yet programmers survive. May i remind you that D is a successor to C. There are lots of good longuages, one exmple is Sather. But no good C ascendants other then D. I'm not a particular fan of C, i'm rather a Modula or O-Pascal guy. But there is no way to convince many programmers to learn anything else than C. C is, C has been, C will always be. Others light up and fade away, may they be thousands of times better. Only a C succesor has a chance. > In Magik there is no goto and yet the company I work for has a base of millions > of lines of code that has been happily written without it. Surely eliminating > the goto and tightening up the switch statement would be good to do in D? In Pascal ascendants, we don't have a fall-through switch either. But we have an often "undocumented" goto. In my early days, after having heard that "goto is evil", i wrote some code (i guess it was a chess knight problem), where i avoided using goto at any cost. Then i looked at the mess and realised: it is not necessary to follow these rumors blindly. I have rewritten it using goto and it has contracted by half in source and became more legible. The best thing to do for legibility are comments. As i grow older, there become more comments and less code in my code. And i do make justified use of anything. Why should I be prevented to do what is natural for a machine and make it another, non-natural way? This is basically what C is, it's always natural to a machine. > "A mechanism of world inter-communication will be devised, embracing the whole > planet, freed from national hindrances and restrictions, and functioning with > marvellous swiftness...." -- Shoghi Effendi -- The Unfoldment of World > Civilisation -- 11 Mar 1936 > |
January 20, 2003 Re: switch statement | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ilya Minkov | "Ilya Minkov" <midiclub@8ung.at> escreveu na mensagem news:b0h3bi$16tc$1@digitaldaemon.com... [snip] > The best thing to do for legibility are comments. > As i grow older, there become more comments and less code in my code. It's strange. As I grow older there is less comments in my code and more contracts/tests/granular functions ;-) --- Outgoing mail is certified Virus Free. Checked by AVG anti-virus system (http://www.grisoft.com). Version: 6.0.443 / Virus Database: 248 - Release Date: 10/1/2003 |
January 20, 2003 Re: switch statement | ||||
---|---|---|---|---|
| ||||
Posted in reply to Daniel Yokomiso | Daniel Yokomiso wrote: > "Ilya Minkov" <midiclub@8ung.at> escreveu na mensagem > news:b0h3bi$16tc$1@digitaldaemon.com... > > [snip] > > >>The best thing to do for legibility are comments. >>As i grow older, there become more comments and less code in my code. > > > It's strange. As I grow older there is less comments in my code and more > contracts/tests/granular functions ;-) > I've got some strange kind of... I can't concentrate. I forget what something means as soon as it's not on the screen anymore. And when i scroll back, i have to figure it out again, all for new. And i'm only 20. Wonder what a wreck i'll be in five years. :> But well, i fully support contracts and such, because they'll test something for me. This doesn't mean i'd write less comment though. > > --- > Outgoing mail is certified Virus Free. > Checked by AVG anti-virus system (http://www.grisoft.com). > Version: 6.0.443 / Virus Database: 248 - Release Date: 10/1/2003 > > |
January 21, 2003 Re: switch statement | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ilya Minkov | Ilya Minkov <midiclub@8ung.at> writes: > Paul Conway wrote: >> In Magik there is no goto and yet the company I work for has a base of millions of lines of code that has been happily written without it. Surely eliminating the goto and tightening up the switch statement would be good to do in D? > > In Pascal ascendants, we don't have a fall-through switch > either. But we have an often "undocumented" goto. In my early days, > after having heard that "goto is evil", i wrote some code (i guess > it was a chess knight problem), where i avoided using goto at any > cost. Then i looked at the mess and realised: it is not necessary to > follow these rumors blindly. I have rewritten it using goto and it > has contracted by half in source and became more legible. The best Recently, I read a cheerful thread on the use of "goto" in the Linux kernel code. It's covered here: http://www.kerneltrap.org/node.php?id=553 A link to the original thread can be found at the bottom of the page. There are many legitimate comments on why goto might actually be useful, including the emulation of RAII idiom where it's not available. -Antti |
January 22, 2003 Re: switch statement | ||||
---|---|---|---|---|
| ||||
Posted in reply to Antti Sykari | The discussion shows important points. Sometimes the conditions don't want to nest, and if you bend and force them the code will inevitedly become ugly. And the code becomes non-editable, that is if you are to add the third which wouldn't like to be nested... You have a long, long way in front of you. (unsigned long long :> )
I may say, that though i kinda respect what Wirth did for language design, i guess he was walking blindly. He's not proficient at structured proramming himself. I read a few excerpts from his book "numerical recepies in Pascal", including that of gauss-jordan elimination. That's something unstructured, illegible, unexplained. You have one main function, which is over a page long, and nests in about 6 or 7 levels. After I saw that, 99% of my respect has vanished. I have split it into 3 tiny functions, each a few lines long, with a nesting level not higher than 2. Sane? Yes. And the compiler would do the inlining.
Antti Sykari wrote:
> Ilya Minkov <midiclub@8ung.at> writes:
>
>
>>Paul Conway wrote:
>>
>>>In Magik there is no goto and yet the company I work for has a base
>>>of millions of lines of code that has been happily written without
>>>it. Surely eliminating the goto and tightening up the switch
>>>statement would be good to do in D?
>>
>>In Pascal ascendants, we don't have a fall-through switch
>>either. But we have an often "undocumented" goto. In my early days,
>>after having heard that "goto is evil", i wrote some code (i guess
>>it was a chess knight problem), where i avoided using goto at any
>>cost. Then i looked at the mess and realised: it is not necessary to
>>follow these rumors blindly. I have rewritten it using goto and it
>>has contracted by half in source and became more legible. The best
>
>
> Recently, I read a cheerful thread on the use of "goto" in the Linux
> kernel code. It's covered here:
>
> http://www.kerneltrap.org/node.php?id=553
>
> A link to the original thread can be found at the bottom of the page.
>
> There are many legitimate comments on why goto might actually be
> useful, including the emulation of RAII idiom where it's not
> available.
>
> -Antti
|
January 24, 2003 Re: switch statement | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ilya Minkov | "Ilya Minkov" <midiclub@tiscali.de> ha scritto nel messaggio news:b0m50i$1389$1@digitaldaemon.com... [...] > I may say, that though i kinda respect what Wirth did for language design, i guess he was walking blindly. The old story that Pascal didn't have GOTO is a hoax. Professor Wirth was one of the first pioneer in an unexplored area, ant still today (after more than 30 years) much of his work is valid, though some parts are not. But the GOTO is another story. Wirth do said GOTO should be avoided, but it was included even in the first revision of Pascal (until today's pascal extensions), because it was inherently useful in some restricted areas. Ciao |
January 25, 2003 Re: switch statement | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ilya Minkov | In article <b0h3bi$16tc$1@digitaldaemon.com>, Ilya Minkov says... >In Pascal ascendants, we don't have a fall-through switch either. But we have an often "undocumented" goto. In my early days, after having heard that "goto is evil", i wrote some code (i guess it was a chess knight problem), where i avoided using goto at any cost. Then i looked at the mess and realised: it is not necessary to follow these rumors blindly. I have rewritten it using goto and it has contracted by half in source and became more legible. The best thing to do for legibility are comments. As i grow older, there become more comments and less code in my code. And i do make justified use of anything. Why should I be prevented to do what is natural for a machine and make it another, non-natural way? This is basically what C is, it's always natural to a machine. What I neglected to mention is that Pascal was invented before the 'structured goto' or 'structured escape'. When I got into Pascal, I was working at TI, and they had their own compilers, which implemented 'escape L' where L is a label (a name, not a number). All you had to do was prefix 'L:' to the block you wanted to get out of. So you could do the equivalent of 'break'. In Magik there is a _break statement which can optionally take a label associated with the block you want out of, just as in TI's Pascal. So eliminating the 'goto' is not the answer in itself, you have to provide an alternative, albeit one that is much tamer, and does not lend itself to spaghetti-style control-flow. In my opinion the human mind quite logically handles composing code using this restricted form of 'goto', and is well disposed to comprehending code written that way. What the human mind does not handle well is spaghetti control-flow. |
January 25, 2003 Re: switch statement | ||||
---|---|---|---|---|
| ||||
Posted in reply to Paul Conway | "Paul Conway" <Paul_member@pathlink.com> wrote in message news:b0sk8c$1le7$1@digitaldaemon.com... > in TI's Pascal. So eliminating the 'goto' is not the answer in itself, you have to provide an alternative, albeit one that is much tamer, and does not lend itself to spaghetti-style control-flow. In my opinion the human mind quite logically handles composing code using this restricted form of 'goto', and is well disposed to comprehending code written that way. What the human mind does not handle well is spaghetti control-flow. If you could draw little arrows in the source code, it wouldn't be so bad. ;) Sean |
January 25, 2003 Re: switch statement | ||||
---|---|---|---|---|
| ||||
Posted in reply to Paul Conway | Maybe C#'s switch statement would be great for D. It is as powerful as the current switch statement, but more bug-safe. Here's an example to get an idea how C#'s switch statement works: switch(i) { case 1: // explicit break statement is generally required some_statement; break; case 2: // compiler flags error, since break is missing here some_statement; case 3: // "fall through" is allowed, as there are no statements here case 4: some_statement; break: case 5: // return or throw statements can be used to "break" cases, too some_statement; return; case 6: // "fall through" with statements is possible with an explicit goto some_statement; goto 7; case 7: // "fall through" with statements is possible with an explicit goto some_statement; goto default; default: } Actually, in C# you have to write "goto case 7" instead of "goto 7". Farmer |
Copyright © 1999-2021 by the D Language Foundation