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

Re: f() { local -ar path=(/bin); };f gives an error

2017-11-27 13:34:05 -0800, Bart Schaefer:
> > On 11/27/2017 03:17 PM, Stephane Chazelas wrote:
> >>
> >> The issue here is that when you're trying to make $path (the
> >> special array variable tied to $PATH) readonly (with a value)
> >> locally in a function, that doesn't work.
> Something a little weird happens with order-of-operations for tied parameters:
> f() { local -ar path; PATH=foo; echo $path }
> Note there's no error there, $path is changed by the assignment to
> $PATH even though the array is read-only.  The reverse also works; you
> have to make both parameters read-only to prevent changing either one
> by assignment to the other.
> f() { path=(/bin); local -r path PATH; ... }  # achieves the desired effect

Wouldn't we want to propagate the "readonly" attribute to the
"tied" variable when the other one is made "readonly"?

There are other combinations that don't work so well like:

$ zsh -c 'typeset -Z3 -T A a; a=1; echo $A'
$ zsh -c 'typeset -T A a; typeset -Z3 A; a=(2 3); echo $a'
2 3
$ zsh -c 'typeset -T A a; typeset -Z3 A; A=1; echo $a'

-U is OK (often used with $PATH).

Would be worth going through all the combinations that one may
want to use and clarify which ones are legal which ones are not.

Having typeset return an error when two exclusive options are
used together (like typeset -iT (documented), typeset -ai (not))
would be helpful.

(why not allowing -i/-F/-Z... and most other scalar flags for
arrays and hashes btw?)


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