GOTO
WSupported on Windows
|
USupported on Unix
|
VSupported on OpenVMS
|
NSupported in Synergy .NET
|
GOTO label
or
GOTO(label[, ...]), selector
Arguments
label
A single statement label or a list of one or more statement labels that exist in the program. The first label is element 1, the second is element 2, and so forth.
selector
An expression whose value selects the corresponding element from the list of labels. (n)
Discussion
The GOTO statement transfers execution control to a specified label. The unconditional form of this statement specifies a single label. The computed form of this statement specifies a list of labels and a selection expression whose value indicates the desired label.
In the computed form of the GOTO statement, if selector is between 1 and the number of elements in label, the corresponding element is selected and control immediately transfers to the to the named label. However, if the value is less than 1 or more than the number of elements in label, no element is selected and execution continues with the statement following the GOTO.
Examples
This subroutine takes a result value to decide which code section to process. If the routine decide returns a result value of 1, control is transferred to lbl1. A value of 2, 3, or 4 transfers control to labels lbl2, lbl3, or lbl4, respectively. Any other value generates the message “… invalid result.”
subroutine choice a_data ,a record result ,d2 proc loop, xcall decide(a_data, result) goto (lbl1, lbl2, lbl3, lbl4), result writes(TTCHN, "... invalid result") goto loop lbl1, writes(TTCHN, "Processing result #1") goto loop lbl2, writes(TTCHN, "Processing result #2") goto loop lbl3, writes(TTCHN, "Processing result #3") goto loop lbl4, xreturn endsubroutine subroutine decide a_data ,a result ,d proc display(TTCHN, "Result value? ") reads(TTCHN, %a(result)) return endsubroutine
We recommend that you not use GOTO when the logic can be written using structured statements instead. For example, we could rewrite the above code as follows: subroutine choice a_data ,a external function decide ,d proc repeat begin using %decide select begincase (1), writes(TTCHN, "Processing result #1") (2), writes(TTCHN, "Processing result #2") (3), writes(TTCHN, "Processing result #3") (4), xreturn writes(TTCHN, "... invalid result") endusing end endsubroutine |