Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
RE: PATCH: 4.1: multi-parameter for loop
- X-seq: zsh-workers 15017
- From: "Andrej Borsenkow" <Andrej.Borsenkow@xxxxxxxxxxxxxx>
- To: "Danek Duvall" <duvall@xxxxxxxxxxx>, "Zsh hackers list" <zsh-workers@xxxxxxxxxx>
- Subject: RE: PATCH: 4.1: multi-parameter for loop
- Date: Thu, 21 Jun 2001 11:19:54 +0400
- Importance: Normal
- In-reply-to: <20010620155622.A3447@xxxxxxxxxxxxxxxxxx>
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
>
> 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