From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3324 invoked from network); 30 Jul 1997 07:05:14 -0000 Received: from euclid.skiles.gatech.edu (list@130.207.146.50) by ns1.primenet.com.au with SMTP; 30 Jul 1997 07:05:14 -0000 Received: (from list@localhost) by euclid.skiles.gatech.edu (8.8.5/8.8.5) id CAA00282; Wed, 30 Jul 1997 02:51:45 -0400 (EDT) Resent-Date: Wed, 30 Jul 1997 02:51:45 -0400 (EDT) From: Zoltan Hidvegi Message-Id: <199707300651.CAA01564@hzoli.home> Subject: Re: RC_EXPAND_PARAM bug In-Reply-To: <970729231110.ZM19573@candle.brasslantern.com> from Bart Schaefer at "Jul 29, 97 11:11:10 pm" To: schaefer@brasslantern.com (Bart Schaefer) Date: Wed, 30 Jul 1997 02:51:35 -0400 (EDT) Cc: zsh-workers@math.gatech.edu (Zsh hacking and development) X-Mailer: ELM [version 2.4ME+ PL31 (25)] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Resent-Message-ID: <"dYWc-3.0.L4.0Iktp"@euclid> Resent-From: zsh-workers@math.gatech.edu X-Mailing-List: archive/latest/3393 X-Loop: zsh-workers@math.gatech.edu Precedence: list Resent-Sender: zsh-workers-request@math.gatech.edu > } 1. `a' was an empty array. In that case the expansion is the empty list, > } and suffix is not evaluated (so even if there is a $[i++] in suffix, i > } will not change). > > Hrm. I think I would have expected to get prefixsuffix, with suffix > evaluated. That's what you get when a=("") or a="", but I can't decide > if that represents an argument in favor, or against. No, an empty array is very different from an array with a single empty element. For example a is a list of directories, and you wand a list of files in there directories, you would say $^a/* If `a' is empty, you want $^a/* expand to nothing, otherwise you would get the list of files in the root directory which you do not want. Such tricks are used in several zsh scripts I guess, and this is the preferable behaviour. And it always worked this way, that's the point where there is not difference between versions. > } and everything is evaluated once unless there is an rc-expansion of > } an empty array which discards everything following that array. > > It's that one that gives me pause. One might require the evaluation of the suffix even if it is discarded later. Do you think it is preferable? > } What would be the preferred evaluation of ${^a}1${^^x}? > > What does the real "rc" shell do? Duplicating it would be my first choice, > unless it does something wildly different than any previous version of zsh. I do not think this has anything to do with rc. I always thought that rc somehow comes from brace, since this kind of array expansion resembles brace expansion. > } Alternatives: > } > } 1. a1x ay b1x by (current) > } > } 2. a1x y b1x y (beta16 and older) > } > } 3. a1x b1x y (just an other logical solution). > > The important question for me is, where are the word breaks in (2)? > That is, if I do: > > z=(${^a}1${^^x}) > > What is ${#z}? If z is ("a1x y" "b1x y"), then I think that's wrong. It is 4. > On Jul 30, 9:46am, Andrej Borsenkow wrote: > } Subject: Re: RC_EXPAND_PARAM bug > } > } zsh-3.1.2 with RC_EXPAND_PARAM bugfix. > } > } % echo ${^a}1${^^x} > } a1x ay b1x by > } > } % echo ${^^a}1${^x} > } a b1x b1y > } > } It looks illogical. Either the latter should be 'ax b1x ay b1y' or the > } former 'a1x b1x y'. > > I agree with Andrej on that. If you're going to map over lists, you > have to map over them in the prefix too, not just in the suffix. > > However, I don't like the behavior of (3), i.e. that when ${x} is a list > then the word break interrupts the rc-expansion. I'd prefer that the > expansion proceed across the suffix in the same way regardless of whether > x is an array or a string, and then introduce the word breaks at the end. I do not understand exatly what you mean, but I'm leaning towards option 3. One possible implementation is to prepend some otherwise impossible string to suffix before expanding it, and after the expansion, check for that, and replace it with elements of a. The impossible string can be { Meta, '@' } or a new metacharacter. This seems to be a really simple to do. Option 2. can use the same trick, but if the modified ${^^a}1${^x} behaviour you suggest above is also required, things become more complicated. Zoltan