On Sat, Oct 15, 2016 at 7:45 PM, Marco Ippolito <maroloc...@gmail.com> wrote:
> On Sat, Oct 15, 2016 at 05:41:32PM +0800, lolilolicon wrote:
>> pop() {
>>     local -n _a=$1
>>     printf -v "$2" "${_a[-1]}"
>>     unset _a[-1]
>> }
>>
>> declare -a a=(a b c)
>> while ((${#a[@]})); do
>>     pop a v
>>     declare -p a v
>> done
>
>
> What I particularly like about your `pop()' function is that it works even
> when called from within a function, rather than from the global scope, as you
> do in your snippet.
>
> Specifically, if we assume that:
>
> - a is a global array
> - a is also a local array inside function1
> - pop is called from function1
>
> it still "does the right thing (TM)", when called before and after the local
> declaration.

I think it's because bash uses dynamic scoping.

>
> Feels like the nameref acts as if it referenced `scope.identifier'.
>
> I would still like to see similar functionality included in Bash, though.
>
> Why do you prefer:
>
>     declare -a a=(a b c)
>
> to:
>
>     a=(a b c)
>
> Guess: "Explicit is better than implicit"? (Zen of Python)

I don't want to think too much about any possible side effects... so I
just write what I mean.

>
> I see it more as: "Redundant code is... redundant".
>
> Why the underscore in:
>
>     local -n _a=$1
>
> Guess: to visually signal it's a nameref?

To avoid name conflicts. If you use say, a instead of _a, you will get
cyclic reference. That's a big pitfall with nameref (combined with
dynamic scoping), if you're not careful with your variable naming
conventions.

>
> Not sure about identifier naming conventions in Bash but that, subjectively,
> seems to allude to something else, like "unused", or "local", etc.
>
> I am generally not particularly in favour of "Hungarian notation" but,
> perhaps, `a_ref' or `a_nameref' rather than `_a' in your case?

I don't think bash has a universal style standard like Python...

Reply via email to