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

Re: Typeset with array

On Fri, 19 Jun 2015 19:36:26 +0200
Oliver Kiddle <okiddle@xxxxxxxxxxx> wrote:
>   local -a foo=one
> So scope needs to be handled first and array conversion later.
> Similarly: typeset -i foo=(23)

I decided to make these errors --- the user is in a good position to do
the right thing here since it's staring them in the face and fixing
things up in typeset by guessing what the user actually meant is (you
can trust me on this :-/) very messy, so I think this is reasonable.

> I did something like the following in _git recently. It works
>   arr=( one two three )
>   local $arr
> There is also
>   local $^arr=foo
> and 
>   local $^^arr=foo
> The nearest in bash would be:
>   declare {a,b,c}=foo
> which works, but not:
>   declare {a,b,c}=(one two)

I think this is now working as expected and documented.

> Bash apparently lets you use += with declare but it seems to be
> meaningless because it is not using the value from the outer scope:
>   $ foo=hello
>   $ function foo {
>   > local foo+=bye
>   > echo $foo
>   > }
>   $ foo
>   bye
>   $ echo $foo
>   hello
> Ksh doesn't allow it. Printing an error in this case seems best which is
> what you have: typeset: not valid in this context: var+

This is still the case.

> Bash allows array element assignments:
>   typeset var[4]=hello
> Zsh now prints "can't create local array elements"
> Including when not in a function.

The problem isn't the assignment but you haven't yet told the shell that
"var" is a (local?) variable or what type it is.  So it's claiming to be
a bit confused. Do you really mean it to update an existing array var,
as it looks like, or don't you?  Or are you replacing the 4th character
of a scalar (which doesn't actually exist yet) with a string?  Both
work if var already exists, but if it doesn't it's syntactically
ambiguous even if you could probably guess that it should create ('' ''
'' hello).  We could tweak this, but it's at the point where I'm not
100% convinced it's the right thing to do.

> That could also be extended to something like var[2,7]=(1 2)

Extending assignments (at least to existing arrays) to handle array
slices would certainly be natural, yes.  I hope must of the mechanism is
already present and just needs borrowing from addvars().

> This is perhaps jumping ahead a bit but for completion, it seems we now
> get -command- context after typeset. As long as -var- context is applied
> inside the actual contexts, having -command- context otherwise for
> typeset would probably work fine.

That still needs looking at --- as this is a rather grungy interface
into the main shell it's a bit of a dark art whether this should be
tweaked by fixing up the context or fixing up the handler, or whether
it's one of the cases where the Red Death holds illimitable sway and
dominion.  With any luck one of the first two is possible.

Scalar and array contexts after typeset assignment seem to be working OK
as a -value-.


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