Re: [RFC] Loop... or...
| From: | Rowan Collins | Date: | Sat, 20 Sep 2014 00:02:59 +0000 |
| Subject: | Re: [RFC] Loop... or... | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-77357@lists.php.net to get a copy of this message | ||
On 19/09/2014 23:47, Andrea Faulds wrote:
On 19 Sep 2014, at 22:56, Leigh <leight@gmail.com> wrote:I saw that discussed in the RFC, and couldn't understand why it would work that way. I think it's just the word "else" that's throwing me - I can see that a block distinguishing between "got to the end" and "hit a break statement" would be useful, but tend to think of "break" as being the exceptional case, so having that *skip* an "else" block feels really backwards to me. It seems like there are actually quite a number of special blocks you *could* define, such as: a) When the body is executed zero times (proposed "or" block) b) When the body is executed exactly once (in a do...while loop, as mentioned in the RFC) c) After every iteration of the loop, even if the iteration was ended early (Perl's "continue" block [1], where "next" is equivalent to PHP's "continue") d) After every iteration of the loop, *only* if the iteration was ended early (would have a similar relationship to (c) as "catch" does to "finally") e) After the end of the loop, if "break" was not used (Python's "else" block [2]) f) After the end of the loop, if "break" WAS used Most of these can be reduced to conditional jumps: (c) can be implemented by replacing "continue" with "goto continue_block" [3], and (d) by skipping that block during normal loop execution [4]; (e) can be done using a goto which jumps over the relevant block [5], and (f) by jumping into a skipped block [6] (a) and (b), on the other hand, I can't think of a way of implementing in existing PHP code without a state variable to track whether (or how often) the loop body was reached. I certainly don't see (a) and (f) as being at all mutually exclusive. Now I'm going to go to bed before the raptors catch up with me from all those gotos... [1] http://perldoc.perl.org/functions/continue.html [2] https://docs.python.org/2/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops [3] http://3v4l.org/TnW12 [4] http://3v4l.org/HbSei [5] http://3v4l.org/T4Boh [6] http://3v4l.org/CmO9C -- Rowan Collins [IMSoP]Loops with a default block, executed in the event that the loop is never entered. https://wiki.php.net/rfc/loop_orWhile this might be useful, I’d prefer we copy Python’s else behaviour, where a block of code is executed when break is never used. This feature makes code that does, for example, a linear search nicer to read.