Re: Open Source

new topic     » goto parent     » topic index » view thread      » older message » newer message

Andy Drummond wrote:
> 
> Jason Gade wrote:
> > 
> > I also like the idea of "continue <label>" or "next <label>" where label
> > is an optional identifier at the beginning of a loop. But I haven't given it
> > too
> > much thought.
> > 
> 
> I would like to suggest three additions to the syntax of Euphoria which would
> get around 99% of the desire for a goto. Nothing new but as suggested above:
> 
>    next var    -- Go to the iteration point of the for loop for this variable
>    exit var    -- Ditto but exit the loop
>    redo var    -- Ditto but re-run the loop without iterating the variable
> 
> For nested loops the interpreter would have to release variables which were
> out of scope, but that is simple enough. If you have three nested loops
> using I, J & K, say, and in the middle had "next I", then that would be coded
> as exit K; exit J; next I;
> 
> }}}
<eucode>
>    for i=1 to 10 do
>       for j=1 to 10 do
>          for k=1 to 10 do
>             if some condition met then
>                next i
> -- effectively: exit k
> --              exit j
> --              next i
>             end if
>          end for
>       end for
>    end for
> </eucode>
{{{

> 
> These three would make the nested loop control much easier to code and much
> easier to read. And the desire for goto would almost vanish. Most people who
> ask for goto statements want them for exiting nested loops, it seems to me.
> 
> Any suggestions? Anyone able to add these to the interpreter?
> 
> Andy Drummond

Your approach only works for for-loops, not for while-loops.
However, I can add the loop variable as an extra possible argument to
exit/next/retry which work in my modified interpreter - see my reply to the first
post from Don Cole-. Only the front end needs be modified:
* next and retry translate to ELSE adequate_target
* Patch[E|X]List() handles delayed block exits, otherwise do business as usual.
Hiding the loop var is done at end of for loop, unchanged.

The other constructs I parse are:
* exit 1 (exit loop above), 2 (two loops above), ... -1 (all loops), -2 (all
loops but the topmost),... exit 0 is the same as exit.
* exit some_string, where the loop has been labelled with some_string.
* The way I add labels is as follows:
for i=1 to n [by 2] [label "my string"] do
if <some_condition> label "my block" then

I have no qualms changing "retry" to "redo". "continue" seems a little ambiguous
to me, which is why I prefer "next" over it, but it's not much of an issue. I
also have an "exif" statement which exits (nested) if blocks, same syntax
enhancements.

CChris

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu