There is such a thing as overdoing GOTOs, but I agree that a blanket 
never-do-it rule is counter-productive.  I don't often use SIGNAL in REXX, 
because I find that its structured features are adequate.  But in other 
languages I have argued for limited GOTO use.

In COBOL, for example, it seems to me that there's a place for GOTO 
TOP-OF-PARAGRAPH (to simulate ITERATE in REXX), GOTO EXIT-PARAGRAPH (to 
simulate LEAVE) and GOTO END-OF-PROGRAM (for controlled abend conditions).  
These don't violate structured-programming principles, they implement them.  In 
VBA I freely use Goto IterateSomething (putting the label just before the Next 
statement).  I don't think PL/1 ever needs it, but I'm glad it's there just in 
case.

Even in REXX there's one missing structured ingredient: some way to leave a 
~simple~ block.  A SELECT comes close, but it's not perfect.  Say you're 
looping through a list of candidates and have to perform a number of candidates:

  do jr=1 to stem.0
    v0=stem.jr
    if v0='' then iterate
    v1=function1(v0)
    if v1<5 then iterate
    v2=functionv2(v1 + othervalue)
    if v2=previous then iterate
    say 'TRK:' v0 v1 v2
    end 

That's great in a controled DO loop.  But it's harder in simple block of code.  
A SELECT won't do the job, because of the calculations you have to do between 
the various tests.  I handle it this way:

  do 1
    if v0='' then leave
    v1=function1(v0)
    if v1<5 then leave
    v2=functionv2(v1+othervalue)
    if v2=previous then leave
    say 'TRK:' v0 v1 v2
    end

I always suspect I'd get complaints from structured enthusiasts if they ever 
saw me cheating like that.  In VBA I can't "Do 1", but I can do this:

  Do 'one time
    If v0 = '' Then Exit Do
    v1 = function1(v0)
    If v1 < 5 Then Exit Do
    v2 = functionv2(v1 + othervalue)
    If v2 = previous Then Exit Do
    MsgBox "TRK: " & v0 & " " & v1 & " " &  v2
    Loop Until True

---
Bob Bridges, [email protected], cell 336 382-7313

/* Being famous has its benefits, but fame isn't one of them.  -Larry Wall */


-----Original Message-----
From: David Crayford
Sent: Tuesday, March 24, 2020 09:03

If you eschew goto how do you deal with error handling and cleanup using 
a language which doesn't support exceptions, finalization or RAII? I find
these kind of blanket rules to lead to bad code with deep nesting and useless 
status variables.

--- On 2020-03-21 11:45 PM, Paul Gilmartin wrote:
> o Symbols EXPOSEd from external scopes can't be used as targets
>     of ITERATE and LEAVE.  (I eschew GOTO; SIGNAL is worse,)

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN

Reply via email to