From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 22392 invoked from network); 21 Jun 2001 07:20:10 -0000 Received: from sunsite.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 21 Jun 2001 07:20:10 -0000 Received: (qmail 7242 invoked by alias); 21 Jun 2001 07:19:25 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 15017 Received: (qmail 7215 invoked from network); 21 Jun 2001 07:19:25 -0000 X-Envelope-Sender-Is: Andrej.Borsenkow@mow.siemens.ru (at relayer david.siemens.de) From: "Andrej Borsenkow" To: "Danek Duvall" , "Zsh hackers list" Subject: RE: PATCH: 4.1: multi-parameter for loop Date: Thu, 21 Jun 2001 11:19:54 +0400 Message-ID: <001901c0fa22$91a2c6d0$21c9ca95@mow.siemens.ru> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook IMO, Build 9.0.2416 (9.0.2911.0) In-Reply-To: <20010620155622.A3447@lorien.emufarm.org> X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4522.1200 Importance: Normal > > On Wed, Jun 20, 2001 at 08:12:09PM +0100, Peter Stephenson wrote: > > > "Bart Schaefer" wrote: > > > Well, there's this: > > > > > > for in in in in; do echo $in; done > > > > It will stop reading parameters when it reaches the second > `in'. I meant > > to document this, although it should be pretty obvious. > > Right. That lacks ambiguity because multiple distinct parameters can't > have the same name. But that ambiguity is missing in > > for i in in in; do .... > > Do you set $i to "in" and "in" or do you set $i and $in set to > "in" and ""? Which opens up a question of odd number of list elements. It is invalid in assignment to hash - shuld it be invalid here as well? > Posix presumably would simply use the first interpretation, Yes. Here are grammar rules: for_clause : For name linebreak do_group | For name linebreak in wordlist sequential_sep do_group name : NAME /* Apply rule 5 */ ; in : In /* Apply rule 6 */ 5. [NAME in for] When the TOKEN meets the requirements for a name (see name in the XBD specification, Glossary ), the token identifier NAME will result. Otherwise, the token WORD will be returned. 6. [Third word of for and case] When the TOKEN is exactly the reserved word In, the token identifier for In will result. Otherwise, the token WORD will be returned. (As indicated in the grammar, a linebreak precedes the token In. If newline characters are present at the indicated location, it is the token after them that is treated in this fashion.) Note linebreak here. Definition is: linebreak : newline_list | /* empty */ ; It means, that the following is valid: fot i in a b c do ... it is currently does not work in zsh: bor@itsrm2% for i for> in a b c bor@itsrm2% ^^^^^^^^^^^^^^^ Oops! as opposed to sh: $ for i > in a b c > do > echo $i > done a b c and > if you want > something like the second, just don't use a parameter named in? Or am I > missing the disambiguation? > I guess, Bart suggestion (use foreach) is better. And more Perlish :-) Is there any feasible way to do something like foreach key val hash or even foreach val array i.e. do *not* expand $hash/%array value? For large arrays it may result in significant speedup. -andrej