Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:20863 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 14659 invoked by uid 1010); 30 Nov 2005 01:40:37 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 14643 invoked from network); 30 Nov 2005 01:40:36 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 30 Nov 2005 01:40:36 -0000 X-Host-Fingerprint: 169.229.139.92 dhcp-139-92.OHR.Berkeley.EDU Received: from ([169.229.139.92:15830] helo=localhost.localdomain) by pb1.pair.com (ecelerity 2.0 beta r(6323M)) with SMTP id 2B/E1-14828-4130D834 for ; Tue, 29 Nov 2005 20:40:36 -0500 Message-ID: <2B.E1.14828.4130D834@pb1.pair.com> To: internals@lists.php.net Date: Tue, 29 Nov 2005 17:40:32 -0800 Lines: 71 X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2800.1506 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506 X-Posted-By: 169.229.139.92 Subject: Labeled Break (nothing at all whatsoever to do with GOTO) From: pollita@php.net ("Sara Golemon") But first, this word from our sponsor: Group A wants anything resembling goto to burn in the fires of hell Group B wants full non-crippled goto or nothing at all Group C wants partial goto (non-backward jumping) or nothing at all Groups B and C both (generally) want it called either GOTO or JUMP, not BREAK Since no group this size will ever come to an agreement on something this divisive, I'd like to turn the topic to a completely different language feature which (might) please enough people to get a rousing consensus. Actual labeled breaks. Not the break+jump that was proposed earlier in the guise of a break statement, but an actual straightforward, no funny-business labeled break which does no more and no less than the current break N; construct, but allows the use of identifier labels rather than numbers which may change as the result of the addition or removal of break containers. http://libssh2.org/patches/true_labeled_break.diff Usage: while FOO ($condition) { /* statements */ break FOO; /* more statements */ } Or a stacked example: for FOO(;;) { while BAR (true) { foreach BAZ ($arr as $val) { switch Foof ($value) { default: do Plop { break FOO; } while (false); } } } } Notes on this implementation: * Labels can't be repeated in an ancestral line. For example, the parser will throw an ERROR on the following: while FOO(true) { while FOO(true) { break FOO; } } * Labels can be repeated by siblings. I'm not married to this, and it certainly has WTF potential. This behavior is easily modified to throw an error. I left it permissable because there was no technical reason to disallow it. For example, the following is okay: while FOO(true) { break; } while FOO(true) { break FOO; } * Labeled breaks also apply to continue; For example: foreach FOO($arr as $key => $val) { if ($key % 2) continue FOO; if (empty(%key)) break FOO; }