Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

RE: PATCH: 4.1: multi-parameter for loop




>
> 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



Messages sorted by: Reverse Date, Date, Thread, Author