zsh-workers
 help / color / mirror / code / Atom feed
From: Michael Hwang <michael.a.hwang@gmail.com>
To: zsh-workers@zsh.org
Subject: Re: [PATCH]: Revamped (P) expansion flag
Date: Sat, 26 Dec 2009 19:59:56 -0500	[thread overview]
Message-ID: <22a0ef080912261659m5a3f3b69ga848f7600813d595@mail.gmail.com> (raw)
In-Reply-To: <22a0ef080912261448x3d14b301yc4082a924cd760d8@mail.gmail.com>

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

Sorry guys,

Frank has just informed me that the patch didn't come through. So I'm
reattaching it, providing a link (http://gist.github.com/264099), and
providing a repo (git://github.com/Nomexous/zsh.git) where the changes
can be retrieved from the "pflag" branch.

Michael Hwang

On Sat, Dec 26, 2009 at 5:48 PM, Michael Hwang
<michael.a.hwang@gmail.com> wrote:
> 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
>

  reply	other threads:[~2009-12-27  1:05 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-12-26 22:48 Michael Hwang
2009-12-27  0:59 ` Michael Hwang [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=22a0ef080912261659m5a3f3b69ga848f7600813d595@mail.gmail.com \
    --to=michael.a.hwang@gmail.com \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).