So I'm still getting caught up on this thread, but hasn't this issue been done
to death in previous threads? Back when I was examining bash's strange declare
-a, you were the very first person I found to notice its quasi-keyword behavior
10 years ago
(https://lists.gnu.org/archive/html/bug-bash/2004-09/msg00110.html). Perhaps
you didn't realize what this was doing at the time?

To me the biggest problem is what happens when you explicitly request a scalar
assignment. (I even specified a[1] to ensure it's not an "a vs. a[0]" issue.)

        bash -c 'typeset -a a; b="(foo bar)"; typeset a[1]=$b; typeset -p a; 
printf "<%s> " "${a[@]}"; echo'
        declare -a a='([0]="foo" [1]="bar")'
        <foo> <bar>

This doesn't fit with my understanding of how it should work. Otherwise I think
the way declare's arguments are interpreted based upon their form and current
set of attributes is pretty well understood, albeit undocumented.

I agree that ksh sometimes makes more sense. I'd add that although ksh's
typeset will never evaluate its non-literal parts of assignment arguments as
assignment syntax after the initial expansion, in ksh it isn't possible to
modify the _type_ of a variable after declaration to begin with, because ksh
has a confusing distinction between "types" and "attributes". Every time you
use a _different_ declaration command, you're wiping all attributes and
effectively unsetting then declaring a whole new variable, while attributes
remain mutable.

         # In this case we're modifying attributes
        $ ksh -c 'typeset -a x=(foo); print "${@x}"; typeset -r x=; print 
"${@x}"'
        typeset -a
        typeset -r -a

         # In this case we're modifying an attribute, then declaring a new 
variable
         # (and then implicitly modifying its attribute, though "${@a}" fails to
         # report it correctly).

        $ ksh -c 'typeset -a a=(foo); print "${@a}"; typeset -T A=(typeset x); 
A a=(x=foo); print "${@a}"; a+=(x=bar); print "${@a}"; typeset -p a'
        typeset -a A
        A
        A -a a=((x=foo) (x=bar))

If it were redesigned today there would surely be no attributes, only types.

-- 
Dan Douglas

Reply via email to