Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: [PATCH] Support the mksh's ${|func;} substitution

On Tue, 10 Sep 2019 at 21:38, Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> wrote:
> On Tue, Sep 10, 2019 at 11:21 AM Sebastian Gniazdowski
> <sgniazdowski@xxxxxxxxx> wrote:
> > Would it be hard to accomplish?
> Probably not -- it could mostly share the code for $(...), it would
> just have to have different opening and closing tokens.  Without
> having given it a huge amount of thought, I suspect I might have
> chosen $(|...) instead of ${|...} had I been implementing for mksh ...
> but I suppose the idea is that parens imply a subshell where braces
> imply the current shell.

So you've implemented ${|code;} for mksh?

> > > ${(x^eval $REPLY^):-for val (test test3) {
> > > reply=\$val
> > > }}
> >
> > I'm not following the example. Why there's reply= and not reply+=? Why
> > in the :- it's reply that's altered, while in (x) there's REPLY?
> I'm writing by analogy to the (e) glob qualifier.  Consider:
> % touch 'echo HELLO WORLD; reply=HERE'
> % print e*(e^'eval $REPLY'^)

Ok, but this could use ...RLD; REPLY=HERE'. The use of reply is just
to simplify, i.e. to use different vars for the (x) embedded code and
for the substitution code?

> So ${(x^'eval $REPLY'^)var} would be analogous to (minus the implied fork)
>   $(REPLY="$var"
>     eval $REPLY
>     print -r -- "${reply[@]}")
> If you change ${var} to ${:-string} then you get
>   $(REPLY="string"
>     eval $REPLY
>     print -r -- "${reply[@]}")

Ahso. So the ${(x^'eval $REPLY'^)var} in the end could be ${(x^'eval
func^):-} ? I.e. the code to evaluate would be provided within the (x)
delimiters, and the connection with REPLY <-> substitution value (i.e.
$var or :-string) would be additional?

> > I think that the (x) flag should be at the top of the list, first.
> That can't be right.  It's got to at least be after nested
> substitution or the parsing for ${...:-...} and similar doesn't make
> sense, and it's probably got to be after (P) flag handling if not also
> after double-quoted joining.

Ok, I've did hurry too much. The :- is point 7.:

       7. Modifiers
              Any modifiers, as specified by a trailing `#', `%', `/' (possi‐
              bly doubled) or by a set of modifiers of the form  `:...'  (see
              the  section  `Modifiers'  in the section `History Expansion'),
              are applied to the words of the value at this level.

It seems to be a good place for the (x) to be put, but with the point
broke down into :- and the other modifiers – they modify the value and
it makes more sense to modify the output of the evaluated code than
the code itself.

All the following points seem to operate in on-value like fashion, so
they should go after (x). The preceding ones OTOH operate in an
select-value like fashion, e.g.:
- subscripting, ${(x)arr[2]} makes sense to operate on the $arr than
on the $REPLY (evaluation result),
- (P), in ${(xP)var} the P makes more sense to operate on $var rather
than on the result of the evaluation – what would it be, to provide a
parameter name for P through an evaluation of code? it does sound
tempting, but the clear-situation that comes from P being always first
is more safe. The programmer that would want to provide a parameter
name through evaluation can do the evaluation manually before the
${(P)var}. It will be possible even in an on-array mapping situation:

arr=( "REPLY=param1" "REPLY=param2" )
: ${a[@]/(#m)*/${${param::=${(x)MATCH}:+}${(P)param}}

- the same exception as for (P) in point "2. Internal parameter flags"
seems to make sense also for (x)

Sebastian Gniazdowski
News: https://twitter.com/ZdharmaI
IRC: https://kiwiirc.com/client/chat.freenode.net:+6697/#zplugin
Blog: http://zdharma.org

Messages sorted by: Reverse Date, Date, Thread, Author