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

Re: One possible answer to typeset vs. unset



On Wed, Dec 2, 2020, 9:19 AM Vincent Lefevre <vincent@xxxxxxxxxx> wrote:
>
> On 2020-11-28 11:49:12 -0800, Bart Schaefer wrote:
> > The typeset -AEFHLRTZailux options are applied upon the first
> > assignment to the variable.
>
> Could you explain the following behavior?
>
> zira% ./zsh -c 'typeset -E x; echo $x; echo $((x+3)); unset x; echo $((x+3));'
>
> 3.
> 3
> zira%
>
> Why do I get "3." if the -E option isn't supposed to be applied yet?

The short answer would be "because math context is magic."

The longer answer is that $((x)) is not the same as ${x} or $(($x)),
and the quoted sentence is more a description of behavior than of
implementation.

What the branch attempts to do is create a "null" concept by combining
two flags, a new one PM_DECLARED (actually an overload of one that is
used only at shell startup) plus PM_UNSET.  When a variable is
assigned, both are cleared.  When a variable is unset, PM_DECLARED is
cleared and PM_UNSET is asserted if necessary.  When a variable is
dereferenced in the normal ${x} way, PM_UNSET results in empty string
being returned no matter what the declared type is.  With the
exception of adding PM_DECLARED, this is the way that locally scoped
variables already work.

Math context doesn't care about PM_UNSET in the same way; it grabs the
value from the union in the parameter struct, which I deliberately
left unchanged as a zero-value double.  This is one reason "null" is
represented in the PM_ flags rather than in the union itself.  So
$((x)) comes back 0.0 instead of empty string, and $((x+3)) works like
it always did.




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