Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: easy calling of associative array?
On 11/01/2015 10:51 PM, Bart Schaefer wrote:
Anyway, that's actually the point. ${(P)ref} resolves to the values of
the array, and then the subscript is applied. Ask yourself: what are
"the values of" an associative array, in every other context?
I'll give it some time, this is new to me. It seems that with an
associative array,
what we have is some 'hidden' syntax, IOW there is a sort of shorthand going
on. As with math, I'd sorta expect that if this functionality was
tacked on
after the fundamentals of the shell were already in place--you leveraged
what was there--there'd be asymmetries.
Experimenting with trying to make accessing associative arrays convenient:
echo_v ()
{
echo ${(P)${:-${1}[$2]}} #this works
#eval "echo \$${1}[$2]" #and this works too.
}
get_v ()
{
#$3=${(P)${:-${1}[$2]}} #nothing works
eval "$3=\$${1}[$2]" #this works
}
set_v ()
{
# {(P)${:-${1}[$2]}}=$3 #nothing works
eval "${1}[$2]=$3" #this works
}
test_v ()
{
#eval "${1}[$2]" #nothing works
#this works
[ ${(P)${:-${1}[$2]}} = $3 ] && echo 'all too true' || echo 'alas, no.'
}
I notice that with 'echo_v' I can use your syntax or 'eval' the thing
which is
much easier to read if nothing else. But with 'get_v' and 'set_v' I can
only make
it work with 'eval' whereas with 'test_v' I can *not* make it work with
'eval'.
At the risk of being too much of a symmetry nut, is it possible to make
either
form work in all the above situations? If so, I have a consistent
interface to
these arrays which would be pleasing, but it's an academic point.
FWIW, this is in the context of studying Sebastian's stuff--there's all
these
variables sloshing about for each of several zcurses windows, and it
would be
C-ish to organize them into arrays, one for each window. However I can
see that this is at the limits of what a shell should be asked to do, since
what I really want is a proper C structure for data:
main_window.window_height
becomes:
${main_window[window_height]}
... but of course I want to be able to replace 'main_window' with
any other window via a variable passed to whatever function:
whatever_window->window_height
becomes:
${(P)${:-${whatever_window}[window_height]}}
... which looks like it's going to work just so long as I can perform
any sort
of operation on the array without difficulty. But there could be speed
issues
and the whole thing might not be worth the trouble, but it is educational
at least.
Messages sorted by:
Reverse Date,
Date,
Thread,
Author