Re: why not promote the plague ? (brace|rc|alternative|modern) syntax

"Mark J. Reed" <[email protected]>
Newsgroups gmane.comp.shells.zsh.devel,gmane.comp.shells.zsh.user
Message-ID <CAA=-s3ypSjUgFws4awicABa=8CPNhWQv5oZTG6O-kDzUViVCrw@mail.gmail.com>
Let's try this again:

First, we have the standard syntax that works in any POSIX shell:
>
>     for var in val1 val2 val3; do command1; command2; done
>     while command1; command2; do command3; command4; done
>     until command1; command2; do command3; command4; done
>     if command1; command2; then command3; command4; else command5;
> command6; fi
>
> The C-style *for* loop is not part of POSIX, but is common to bash, ksh,
> and zsh:
>
>     for (( init; condition; increment )) do command1; command2; done
>
> The *repeat* loop is purely a Zsh innovation not present in the other
> shells:
>
>     repeat $times; do command1; command2; done
>

>
All of the above have alternative syntax in Zsh that works irrespective of
> the *SHORT_LOOPS* option.
>

So far, so correct, but I got a little too specific with the details.

> Since all of these constructs have the form *intro-keyword *part1 *keyword1
> *part2 *keyword2*, the basic idea is to replace *keyword1 *and *keyword2 *with
> curly braces.  But the *for*...*in *loop also has a *keyword0*, namely
> *in*, which needs its own d
>

>     for var (val1 val2 val3) { command1; command2; }
>     while (command1; command2) { command3; command4; }
>     until (command1; command2) { command3; command4; }
>     if (command1; command2) { command3; command4; } else { command5;
> command6; }
>     for (( init; condition; increment )) { command1; command2; }
>     repeat $times { command1; command2; }
>
> NOTE: If the conditional command for while/until/if is a single ((...)) or
> [[...]] test, you don't need the extra parentheses around it.
>
> Finally, we have the Zsh "short" syntax, which works only with *setopt
> SHORT_LOOPS*, and *only if the body is a single command*:
>
>     for var (val1 val2 val3) command1;
>     while (command1; command2) command3
>     until (command1; command2) command3
>     if (command1; command2) command3;
>     for (( init; condition; increment )) command1;
>
> NOTE: again, the parentheses can be omitted around a single ((...)) or
> [[...]] test. Also, as far as I know, there's no way to attach an *else* to
> an *if* when using the short syntax.
>
> On Sat, Dec 14, 2024 at 2:29 AM Marc Chantreux <[email protected]> wrote:
>
>> On Fri, Dec 13, 2024 at 07:07:17PM -0500, Lawrence Velázquez wrote:
>> > Mikael's point was to distinguish between the alternative forms
>> > and the SHORT_LOOPS forms.  None of your examples works without
>> > SHORT_LOOPS
>>
>> thanks for noticing. which leads me to open zshmisc(1) and read
>> read "ALTERNATE FORMS FOR COMPLEX COMMANDS". TIL that my coding
>> style is actually a mix of the alternative form and SHORT_LOOPS
>> and the difference is subtile:
>>
>>         « The  short  versions  below only work if sublist is of the form
>> `{
>>         list }' or if the SHORT_LOOPS option is set »
>>
>> regards
>> --
>> Marc Chantreux
>>
>>
>
> --
> Mark J. Reed <[email protected]>
>


-- 
Mark J. Reed <[email protected]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.