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

Lawrence Velázquez <[email protected]>
Newsgroups gmane.comp.shells.zsh.devel,gmane.comp.shells.zsh.user
Message-ID <[email protected]>
On Sat, Dec 14, 2024, at 2:54 PM, Mark J. Reed wrote:
> First, we have the standard syntax that works in any POSIX shell:
>
>     for var in val1 val2 val3; do command1; command2; done

While we're on the subject of parsing loops, here is some amusing
information about how historical shells handle the OG short `for'
loop, which implicitly uses the positional parameters.

https://www.in-ulm.de/~mascheck/various/bourne_args/#endnote


> 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

As an aside, the separator following ((...)) is optional for all
three shells.

	% bash -c 'for ((;;)) do break; done'
	% ksh -c 'for ((;;)) do break; done'
	% zsh -c 'for ((;;)) do break; done'
	%


> All of the above have an alternative syntax in Zsh that works 
> irrespective of the *SHORT_LOOPS* option, where you put the condition 
> (if any) in parentheses and the body in curly braces:
>
>     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.

Other than the `for' variants, none of these (or the short forms
below) requires parentheses _per se_.  What they require is that
their conditions be, as zshmisc(1) so vaguely puts it, "suitably
delimited".  These are all valid:

	% if ! ( true ) { print true }
	% if [[ x ]] && { false } { print true }
	% if true; ! [[ x ]] { print true }
	% if print ignored | (( 0 )) { print true }
	%

So wrapping the condition in parentheses is not alternative
complex-command syntax, but merely standard subshell syntax
that slows loops to a crawl and breaks condition lists that
need to modify shell state.  Avoid.


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

Short-loop bodies aren't limited to single commands; they are
sublists, which POSIX calls AND-OR lists.  For example, this:

	% setopt SHORT_LOOPS
	% if { false } print foo && print bar
	%

works like this:

	if false
	then
		print foo && print bar
	fi

not this:

	if false
	then
		print foo
	fi && print bar


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