Is this PEP-able? fwhile

J

jimjhb

Syntax:


fwhile X in ListY and conditionZ:


The following would actually exactly as: for X in ListY:


fwhile X in ListY and True:


fwhile would act much like 'for', but would stop if the condition after the'and' is no longer True.


The motivation is to be able to make use of all the great aspects of the python 'for' (no indexing or explict
end condition check, etc.) and at the same time avoiding a 'break' from the'for'.


(NOTE: Many people are being taught to avoid 'break' and 'continue' at allcosts, so they instead convert
the clean 'for' into a less-clean 'while'. Or they just let the 'for' run out. You can argue against this teaching
(at least for Python) but that doesn't mean it's not prevalent and prevailing.)


[People who avoid the 'break' by functionalizing an inner portion of the loop are just kidding themselves and making
their own code worse, IMO.]


I'm not super familiar with CPython, but I'm pretty sure I could get this up and working without too much effort.
The mandatory 'and' makes sense because 'or' would hold the end value valid(weird) and not accomplish much.
The condition itself could of course have multiple parts to it, including 'or's.


It's possible the name 'fwhile' is not optimal, but that shouldn't affect the overall merit/non-merit of the concept.


Comments and Questions welcome.


Thanks.
 
D

Dennis Lee Bieber

(e-mail address removed):


There is precedent in Algol 68:

for i from 0 to n while safe(i) do .. od
The REXX variant would be

do for i = 0 to n while safe(i)
...
end

Basically one has an optional "for" clause ( for index = initial to end
by step ), and one has an optional while/until clause -- Hmm, wonder if
some interpreters would parse both while and until <G>. I need to install
Regina Rexx on this new machine...
 
C

Chris Angelico

The REXX variant would be

do for i = 0 to n while safe(i)
...
end

Basically one has an optional "for" clause ( for index = initial to end
by step ), and one has an optional while/until clause -- Hmm, wonder if
some interpreters would parse both while and until <G>. I need to install
Regina Rexx on this new machine...

Modulo the 'for' keyword, which is superfluous there. Here's a test
script I knocked up on my OS/2 box back home:

/* */
do i=0 to 9 while safe(i)
say i" is safe"
end
exit

safe: procedure
return arg(1)\=6

The \= in the last line is the REXX "not-equal" operator, like != in
Python. This outputs:

0 is safe
1 is safe
2 is safe
3 is safe
4 is safe
5 is safe

and then terminates. It's pretty clean; the DO/END construct defines a
block, and may optionally execute it more than once. With no
arguments, it just creates a block that executes once (equivalent to
C's braces); valid args include FOREVER (infinitely loop), WHILE
condition (iterate while condition is true), UNTIL condition (execute
once, then check condition, iterate while condition is false - like a
do/while in C), var=value (eg "I=1" - set var to value, then increment
by 1 or by the "BY" value, continue forever or until the "TO" value),
and possibly another that's slipped my mind. Aside from FOREVER, which
stands alone, they're completely independent.

But that's syntax, lots of it. What I'd like to see in Python is
simply a bit of flexibility in the rule about newlines. The for/if
construct in Python could be exactly the same as it now is, only with
the two statements on one line, and it would look very similar to the
existing notation. I can already one-line a simple statement:

for i in range(10): print(i)

I just can't put in an if:
SyntaxError: invalid syntax

But I can, as long as I use expression-if:

Seriously, I can use Perl-style notation to achieve this. Does that
seem right to you? *boggle*

ChrisA
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,734
Messages
2,569,441
Members
44,832
Latest member
GlennSmall

Latest Threads

Top