(Thanks for changing the Subject:)
On Tue, 24 Mar 2020 11:19:16 -0400, Bob Bridges wrote:

>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 
>
I almost always label ITERATE, LEAVE, and END for clarity and'
syntax error detection:

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

(Even though it looks more like "GOTO jr".)

>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
>
Even at the cost of introducing an almost-otiose control variable:

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

>I always suspect I'd get complaints from structured enthusiasts if they ever 
>saw me cheating like that.  ...
>
Not from me.  Except for not using labels.

-- gil

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

Reply via email to