Re: goto and label (cont)
- To: mathgroup at smc.vnet.net
- Subject: [mg57831] Re: [mg57768] goto and label (cont)
- From: "Ingolf Dahl" <ingolf.dahl at telia.com>
- Date: Thu, 9 Jun 2005 05:55:32 -0400 (EDT)
- Organization: Goteborg University
- Reply-to: <ingolf.dahl at telia.com>
- Sender: owner-wri-mathgroup at wolfram.com
Ok, Hi Gui, The reason for us as humans to write computer code is to take control over the action of computers. The reason to avoid the Goto command is to avoid spaghetti code that is difficult to debug and to reinterpret later. The Goto enables you to create a wormhole from any point at any level to any other point at any other level in the program, and this means that there is no clear "flow direction" in the program. Is this way the program easily gets very complicated topology. When you try to read such a program, and find a label, you must check the complete code for Goto commands, and understand the state of the variables at the jump, to be able to see the effects of the commands following the label. I have had difficulties in rewriting my own old Basic programs as Mathematica code just because these goto commands. I also imagine that compilers can have difficulties to create optimal code when Goto commands are used. Thus, as a general rule, avoid "Goto". As with all such general rules, there might of course be exceptions. We can rewrite your pseudo code in the following way, to obtain one outer and one inner loop, with only one Goto for each label. label[L2] label[L1] do something1 if condition1==true goto[L1] do something2 if condition2==true goto[L2] do some other stuff Here is some equivalent pseudo code, using While instead. With While, there is automatically only one start and end point per jump. I redefine condition1 and condition2 as variables, which can take the values True or False: condition1 = True; condition2 = True; While[condition2, While[condition1, do something1; recalculate condition1]; do something2; condition1 = True; recalculate condition2] Here is a concrete example: x = 0; y = 0; condition1 = True; condition2 = True; While[condition2, While[condition1, x = x + 1; condition1 = x <= 10]; y = y + 1; condition1 = True; condition2 = (x <= 15 || y <= 10)]; {x, y} (Returns {21,11}) Best regards Ingolf Dahl Sweden -----Original Message----- From: Guy Israeli [mailto:guyi1 at netvision.net.il] To: mathgroup at smc.vnet.net Subject: [mg57831] [mg57768] goto and label (cont) Hi again, since everyone tells me not to use goto and label (although for the use i'll describe below it is very comfterable and the simplest way to do it. If anyone can suggests an alternative/mathematica way of doing it, please do. the pseudocode with goto label[l] do something1 if condition1==true goto[l] do something2 if condition2==true goto[l] do some other stuff as you see i do something1 then check some cond. if something didn't go well i start doing everything from the start. same for something2. I want to go all the way to the top. using a while or something alike would need some variable to hold it and maintaine which is messy. or if a do while loop exists (?) it will need to do everything and then restart. I want some mechanism that will restart itself if conditions are not met. goto seems the only simple option to do it. again, suggestions are always welcomed Thanks a lot, Guy