"Enhanced While Loop", by W Isaac Carroll
This commit is contained in:
parent
7361fd0b50
commit
a4ebb4cd61
|
@ -0,0 +1,126 @@
|
|||
PEP: 315
|
||||
Title: Enhanced While Loop
|
||||
Version: $Revision$
|
||||
Last-Modified: $Date$
|
||||
Author: W Isaac Carroll <icarroll@pobox.com>
|
||||
Status: Draft
|
||||
Type: Standards Track
|
||||
Content-Type: text/plain
|
||||
Created: 25-Apr-2003
|
||||
Python-Version: 2.4
|
||||
Post-History:
|
||||
|
||||
|
||||
Abstract
|
||||
|
||||
This PEP proposes adding an optional "do" clause to the beginning
|
||||
of the while loop to make loop code clearer and reduce errors
|
||||
caused by code duplication.
|
||||
|
||||
|
||||
Motivation
|
||||
|
||||
It is often necessary for some code to be executed before each
|
||||
evaluation of the while loop condition. This code is often
|
||||
duplicated outside the loop, as setup code that executes once
|
||||
before entering the loop:
|
||||
|
||||
<setup code>
|
||||
while <condition>:
|
||||
<loop body>
|
||||
<setup code>
|
||||
|
||||
The problem is that duplicated code can be a source of errors if
|
||||
one instance is changed but the other is not. Also, the purpose
|
||||
of the second instance of the setup code is not clear because it
|
||||
comes at the end of the loop.
|
||||
|
||||
It is possible to prevent code duplication by moving the loop
|
||||
condition into a helper function, or an if statement in the loop
|
||||
body. However, separating the loop condition from the while
|
||||
keyword makes the behavior of the loop less clear:
|
||||
|
||||
def helper(args):
|
||||
<setup code>
|
||||
return <condition>
|
||||
|
||||
while helper(args):
|
||||
<loop body>
|
||||
|
||||
This last form has the additional drawback of requiring the loop's
|
||||
else clause to be added to the body of the if statement, further
|
||||
obscuring the loop's behavior:
|
||||
|
||||
while True:
|
||||
<setup code>
|
||||
if not <condition>: break
|
||||
<loop body>
|
||||
|
||||
This PEP proposes to solve these problems by adding an optional
|
||||
clause to the while loop, which allows the setup code to be
|
||||
expressed in a natural way:
|
||||
|
||||
do:
|
||||
<setup code>
|
||||
while <condition>:
|
||||
<loop body>
|
||||
|
||||
This keeps the loop condition with the while keyword where it
|
||||
belongs, and does not require code to be duplicated.
|
||||
|
||||
|
||||
Syntax
|
||||
|
||||
The syntax of the while statement
|
||||
|
||||
while_stmt : "while" expression ":" suite
|
||||
["else" ":" suite]
|
||||
|
||||
is extended as follows:
|
||||
|
||||
while_stmt : ["do" ":" suite]
|
||||
"while" expression ":" suite
|
||||
["else" ":" suite]
|
||||
|
||||
|
||||
Semantics of break and continue
|
||||
|
||||
In the do-while loop the break statement will behave the same as
|
||||
in the standard while loop: It will immediately terminate the loop
|
||||
without evaluating the loop condition or executing the else
|
||||
clause.
|
||||
|
||||
A continue statement in the do-while loop will behave somewhat
|
||||
differently than in the standard while loop. Instead of jumping
|
||||
back to the loop condition, it will jump to the beginning of the
|
||||
first suite of the loop. This is to ensure that the setup code
|
||||
has a chance to do its job before the condition is evaluated.
|
||||
|
||||
|
||||
Future Statement
|
||||
|
||||
Because of the new keyword "do", the statement
|
||||
|
||||
from __future__ import do_while
|
||||
|
||||
will initially be required to use the do-while form.
|
||||
|
||||
|
||||
Implementation
|
||||
|
||||
The first implementation of this PEP can compile the do-while loop
|
||||
as an infinite loop with a test that exits the loop.
|
||||
|
||||
|
||||
Copyright
|
||||
|
||||
This document is placed in the public domain.
|
||||
|
||||
|
||||
|
||||
Local Variables:
|
||||
mode: indented-text
|
||||
indent-tabs-mode: nil
|
||||
sentence-end-double-space: t
|
||||
fill-column: 75
|
||||
End:
|
Loading…
Reference in New Issue