[Python-ideas] Updating PEP 315: do-while loops

Steven D'Aprano steve at pearwood.info
Sun Apr 26 08:42:36 CEST 2009


On Sun, 26 Apr 2009 11:00:26 am Raymond Hettinger wrote:

> Am working on PEP 315 again, simplifying the proposal by focusing on
> a more standard do-while loop.
>
> The two motivating cases are:
[snip]

A quick-and-dirty data point for you. Using Google code search, I found 
approx 80,000 hits for "lang:Pascal until" versus 129,000 hits 
for "lang:Pascal while". So the number of cases of test-at-top versus 
test-at-bottom loops are very roughly 3:2 in Pascal code indexed by 
Google.

(Disclaimer: both searches revealed a number of false positives. I've 
made no attempt to filter them out.)

For those who aren't familiar with Pascal, the test-at-top and 
test-at-bottom loops are spelled:

WHILE condition DO
  BEGIN
    suite;
  END;

and

REPEAT
  suite;
UNTIL condition;

WHILE exits the loop when condition is False, and REPEAT...UNTIL exits 
when condition is True.

So I think the first question we need to deal with is, should we be 
discussing do...while or do...until? Is there a consensus on the sense 
of the condition test?

while True:  # do...while, exit when condition is false
    suite
    if not condition: break

or 

while True:  # do...until, exit when condition is true
    suite
    if condition: break


Or do we doom this proposal by suggesting variant spellings that cover 
both cases?


> The challenge has been finding a syntax that fits well with the
> patterns in the rest of the language. It seems that every approach
> has it's own strengths and weaknesses.
>
> 1) One approach uses the standard do-while name but keeps usual
> python style formatting by putting the condition at the top instead
> of the bottom where it is in C and Java:

I'm not entirely comfortable with writing the test at the top of the 
loop, but having it executed at the bottom of the loop. But I'd prefer 
it to no do-loop at all.

Oh, I should ask... will whitespace around the ellipsis be optional?


> 2) Another approach is to put the test at the end.  Something like:
>
>     do:
>         j = _int(random() * n)
>
>     :while j in selected
>
>     do:
>         j = _int(random() * n)
>         while j in selected
>
> These seem syntactically weird to me and feel more like typos than
> real python code. I'm sure there are many ways to spell the last
> line, but in the two years since I first worked on the PEP, I haven't
> found any condition-at-the-end syntax that FeelsRight(tm).

I don't like either of those variants. I agree, they feel strange. The 
only variant that I find natural is the Pascal-like:

do:
    suite
until condition

where the "until" is outdented to be level with the do. My vote goes for 
this, although I'm probably biased by my familiarity with Pascal. How 
does that feel to you?


I don't think I could live with

do:
    suite
while condition

even though it isn't strictly ambiguous, nor does it prevent nesting a 
while-loop inside the do-loop:

do:
    suite
    while flag:
        another_suite
while condition

But it looks disturbingly like an invalid line.


If outdenting is impossible, then I could live with it being indented:

do:
    suite
    until condition  # or while if you prefer


but what happens if there is indented code following the until/while? 
Syntax error, or does it just never get executed?


My preferences, in order of most-liked to least-liked, with my score:

(1) +1
do:
    suite
until condition # exit loop when condition is true

(2) +0.5
do...until condition: # exit loop when condition is true
    suite

(3) +0.5
do...while condition: # exit loop when condition is false
    suite

(4) +0
do:
    suite
    until/while condition
    mystery_suite  # what happens here?

(5) -0
The status quo, no do-loop at all.

(6) -0.5
do:
    suite
:while/until condition

(7) -1
do:
    suite
while condition




-- 
Steven D'Aprano



More information about the Python-ideas mailing list