Bug 20255 - Simple Loop Labeling

Mark Waddingham mark at livecode.com
Fri Aug 11 07:16:58 EDT 2017


On 2017-08-11 12:51, Lagi Pittas via use-livecode wrote:
> Hi Mark,
> 
> I Beg to Differ about Next Repeat.
> 
> "It's not wat you do it's the way that you do it" comes to mind
> 
> Someone who writes spaghetti code can do it very well in any language 
> but
> its much more difficult without the structure brought in by the
> Algol/Pascal/Modula.

I'm not sure I quite get your point here...

Pure structured control flow does not allow any exit from a loop (it's 
definition is actually related to properties of the 'control-flow graph' 
(CFG) created by what are called 'basic blocks' when you analyze code at 
a more fundamental level than the syntax - structured control-flow only 
produces 'reducible CFGs' which have nice properties).

However, there are relatively straightforward transformation you can 
apply to mostly-structured-control-flow with 'exit' to turn it into pure 
structured control flow:

   repeat while tCondition
     ... before ...

     exit repeat

     ... after ...
   end while

Can be re-written as:

   repeat while tCondition and not tExit
     ... before ...

     put true into tExit

     if not tExit then
       ... after ...
     end if
   end repeat

The latter is 'pure structured control flow' - so 'exit loop' does no 
harm; the compiler can do an 'easy' transformation on the code to make 
it work; and that transformation is something which you have to do by 
hand if 'exit loop' is not available.

The key thing here is extending 'exit loop' to allow you to exit from 
more than one loop at once - if a language does not have this ability 
directly, then you have to write code to do it yourself (which is always 
possible - by the above transformation). Needing to exit multiple loops 
is not uncommon - which is why that extension might well be useful.

Similarly, 'next repeat' is often useful at least in the current loop - 
I'm not sure how useful it is for nested loops - it might not be. 
However, there is a transformation you can do for that as well:

   repeat while tCondition
     ... before ...

     next repeat

     ... after ...
   end while

Becomes:

   repeat while tCondition
     ... before ...

     put true into tNext

     if not tNext then
       ... after ...
     end if
   end while

So, having written that, clearly it is fine (it is actually the same as 
'exit repeat'; except that the boolean flag you need to create doesn't 
become part of the loop condition).

> If you only allow GOTOS within a procedure to a NON numeric label then 
> you
> can write structured code in any language.

Not strictly true - I think the rules (in terms of the actual underlying 
definition of structured control flow) is that you must not jump into a 
block of code which has a jump from elsewhere at the top. e.g.

void func()
{
    while(condition)
    {
      ...
foo:
       if (baz)
         goto bar:
    }

    while(othercondition)
    {
      ...
bar:
      if (foobar)
        goto foo:
    }
}

This produces a non-reducible CFG if memory serves. So as soon as you 
allow general GOTO, you end up with the ability to create irksome CFGs 
from the point of view of a compiler.

> Of course if it is time critical and every millisecond saved is 
> important
> then if spaghetti code is needed to get the speed then there is no 
> "best
> way" . But as I have said I have never missed Goto in nearly 40 Years 
> of
> Coding in High level languages (you can't not use them in Machine code
> which Dijkstra was acknowledging in his "Goto Considered Harmful"  
> article).

Indeed - the ability for a compiler to analyse code is the thing which 
makes it potentially run faster. With GOTO you can do the optimizations 
yourself; however, in almost all cases if you can only produce 
structured control flow, then a suitable competent compiler can do the 
work for you - making your code easier to read and maintain, whilst 
still not loosing performance.

Warmest Regards,

Mark.

P.S. I should point out that LCS is not a 'suitably competent compiler' 
as yet - however, that does not mean we should introduce language 
features which make it much harder for it to be given greater 
competence.

-- 
Mark Waddingham ~ mark at livecode.com ~ http://www.livecode.com/
LiveCode: Everyone can create apps




More information about the use-livecode mailing list