Date:        Tue, 19 Sep 2023 18:09:13 +0100
    From:        Kerin Millar <k...@plushkava.net>
    Message-ID:  <20230919180913.bd90c16b908ab7966888f...@plushkava.net>

  | >   | On Tue, 19 Sep 2023, at 8:40 AM, Victor Pasko wrote:
  | >   | > in let "<>" and $((<>)) constructs all variables should be
  | >   | > evaluated

  | This assertion would be more compelling had you explained at some point
  | during the ensuing treatise how to potentially square the request being
  | made with the base#n notation, as presently implemented by bash.

I didn't even consider that case plausible, or what was intended, but now
I can see that maybe it was - but that could never work.  Not (quite) for
the reason that you gave (or even Chet's explanation, though if he had
explained why it is like it is, the explanation might have been like I
am about to give), but because the syntax simply doesn't work out like that.

Given a token of x#y that's not a variable, variables have no #'s in their
names, so one cannot be expecting that (this would mean something entirely
different if actually written) ${x#y} to be evaluated in that case.

So, the only way to get variables out of that would be to split it into
two (or three) tokens, x and #y or x # and y.   One might parse it like
that, and then evaluate x and y as variables, but if that were done, now
we'd have 3 tokens, not the one (representing a number in some other base)
to deal with, say 11 # 97 (where the 11 and 97 are now integers, not strings).

That's not what was desired, which was 11#97 as one token (106 decimal, if
my mental arithmetic is correct), and the only way to get it back would be
to invent a new (very high priority, must be higher than unary '-' for
example) # operator, which takes a base as its left operand, and a value
as its right, and somehow reinterprets the value in that base - but that's
essentially impossible, as we now have binary 97, which might have originally
been 0141 or 0x61 -   11#0141 is an entirely different thing from 11#97
and at this stage we simply wouldn't know which was intended.

So that method can't work either.

The $x#$y form works, as that (everything in $(( )) or other similar
contexts) is being treated just like inside a double quoted string.
Those get expanded first before being used, in this case as 11#97 (just
as strings, variable expansion has no idea of the context, nor does it
generally care what characters it produces) as a char sequence in the
effectively double quoted string.   The arith parser can then parse that,
and see it has a specific base, and value - if y had been 0141 it would have
been parsing 11#0141 instead, unlike a simple reference of 'y' in the
expression, where all of 0x61 97 and 0141 turn into the binary value "97"
for arithmetic to operate on).

That's why I never even considered that might have been what was being
requested, it can't work as hoped.

kre




Reply via email to