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