zsh-workers
 help / color / mirror / code / Atom feed
* [PATCH]: Revamped (P) expansion flag
@ 2009-12-26 22:48 Michael Hwang
  2009-12-27  0:59 ` Michael Hwang
  2010-01-05 17:20 ` Peter Stephenson
  0 siblings, 2 replies; 8+ messages in thread
From: Michael Hwang @ 2009-12-26 22:48 UTC (permalink / raw)
  To: zsh-workers

[-- Attachment #1: Type: text/plain, Size: 2874 bytes --]

Hello all,

In my opinion, the current behavior of the P expansion flag is not
intuitive, and possibly even buggy. For instance:

% FOO='hello!'
% REF='FOO BAR'
% print ${(P)${REF}}
hello!

In this case, ${(P)${REF}} should expand to nothing, because 'FOO BAR'
is not a proper parameter name. However, the current logic takes only
as much as makes sense, and ignores the rest. This creates confusion
with arrays:

% ARRAY=(FOO CLUE SHOE)
% FOO=zsh
% CLUE=is
% SHOE=awesome
% print ${(P)${ARRAY}}
zsh

One would think that each element of the reference ARRAY would
replaced by the value of the variable in that element. However, zsh
will just take the value of FOO, as it's the longest string that makes
sense as a variable name.

On the more buggy-ish side:

% STRING='zsh is awesome!'
% STR='zsh sucks... :-/'
% REF=STRING
% print ${(P)REF[1,3]}
zsh sucks... :-/

As ${(P)REF} is really ${(P)${REF}}, one would think that that
${(P)REF[1,3]} would be expanded as ${(P)${REF}[1,3]}. But as you can
see, it is instead expanded as ${(P)${REF[1,3]}}.

This patch fixes all these problems. The concept of "subexpression" no
longer applies with the P flag. Instead, one should consider whether
or not the "inside" expression (I call it a "reference") expands to
more than one word.

Notably:
1.) A reference can now be a mix of plain text and expansions. For
example, ${(P)${FOO}_BAR}.
2.) A reference can be quoted. Note that ${(P)"REF"} is now possible,
and expands as if it were ${(P)"${REF}"}.
3.) If the reference expands to more than one word, then each element
will be expanded to take on the value of that variable. (See below.)

It is simplest with quotes:

% FOO='zsh.org'
% REF=FOO
% print ${(P)"REF"}
zsh.org
% print ${(P)"${REF}"}
zsh.org

Fairly straight forward. But notice what happens when our reference
expands to a non-valid parameter name:

% FOO='merry xmas!'
% REF='FOO FOO'
% print ${(P)"${REF}"}

% print ${(P)"REF"}


Now try mixing (in quotes):

% FOOBAR='buy champagne for new year'
% REF=FOO
% print ${(P)"${REF}BAR"}
buy champagne for new year

The expansion takes on the value of the variable name that the insides
expand to.

Without quotes, array references are possible.

% REFS=(A B C)
% A=1
% B=2
% C=3
% print -l -- ${(P)${REFS}}
1
2
3

It is also possible to have an array reference with an element that
refers to an array parameter:

% REFS=(A B C)
% A=1
% B=(2 two)
% C=3
% print -l -- ${(P)${REFS}}
1
2
two
3

And finally, mixing, non-quoted.

% REFS=(FOO CLUE SHOE)
% FOOBAR=zsh
% CLUEBAR=is
% SHOEBAR=awesome
% print ${(P)${^REFS}BAR}
zsh is awesome

Note that ${(P)${REFS}BAR} would just expand to "awesome", as
${REFS}BAR expands to the words "FOO" "CLUE" "SHOEBAR", with FOO and
CLUE not being set.

Please test these changes. paramsubst() took a long time to
understand, so I'm sure that I've introduced a bug or two.

Michael Hwang

^ permalink raw reply	[flat|nested] 8+ messages in thread
* Re: [PATCH]: Revamped (P) expansion flag
@ 2010-01-01 16:35 Michael Hwang
  0 siblings, 0 replies; 8+ messages in thread
From: Michael Hwang @ 2010-01-01 16:35 UTC (permalink / raw)
  To: zsh-workers

I made a mistake with the last patch. This remedies that problem.

I'm using git send-email, so the patch should finally show up with the email.
But as always, the changes can be pulled from the pflag branch of my GitHub
repo (git://github.com/Nomexous/zsh.git).

Michael Hwang


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2010-01-06 15:23 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-12-26 22:48 [PATCH]: Revamped (P) expansion flag Michael Hwang
2009-12-27  0:59 ` Michael Hwang
2009-12-28  0:57   ` Michael Hwang
2010-01-05 17:20 ` Peter Stephenson
2010-01-05 22:52   ` Michael Hwang
2010-01-06  9:48     ` Peter Stephenson
2010-01-06 15:23     ` Bart Schaefer
2010-01-01 16:35 Michael Hwang

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).