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

Re: Feature Patch: Use completion to view parameter values



On 3/29/21, Daniel Shahaf <d.s@xxxxxxxxxxxxxxxxxx> wrote:
> Bart Schaefer wrote on Mon, Mar 29, 2021 at 10:20:08 -0700:
>> On Mon, Mar 29, 2021 at 10:11 AM Daniel Shahaf <d.s@xxxxxxxxxxxxxxxxxx>
>> wrote:
>> >
>> > I think that's right.  -workers@: Is it possible for a non-PM_SPECIAL
>> > parameter have a custom getfn?
>>
>> Only with the zsh/param/private module, I think, and in that case the
>> getfn is just a wrapper around the default and doesn't add any
>> side-effects.
>
> Thanks, Bart.
>
> And as to $AUTOINCREMENT, this isn't the first time I mentioned it as
> a hypothetical, so I'm going to go ahead and post it here.  I suspect
> people from the future will use this for something-or-other.
>
> Works as you'd expect:
> .
>     % echo $AUTOINCREMENT $AUTOINCREMENT
>     0 1
>     %
>
> And in Marlon's patch with the ${(t)…*special*} exclusion bypassed:
> .
>     % zstyle \* extra-verbose yes
>     % AUTOFOO=42
>     % echo $AUTO<TAB><TAB>
>     AUTOFOO       -- 42  AUTOINCREMENT -- 2
>     AUTOFOO       -- 42  AUTOINCREMENT -- 4
>
> Yes, it does actually increment the variable twice, probably because the
> _parameters patch uses both ${(t)${(P)}} and then ${(P)}, and the former
> does an increment too:
> .
>     % echo $AUTOINCREMENT ${(tP)AUTOINCREMENT} $AUTOINCREMENT
>     0 array-special 2
>     %
>
> I'm not proposing to commit $AUTOINCREMENT.
>
> Cheers,
>
> Daniel
>
> P.S.  Another similar example is Perl's magic flip-flop variable:
> «perl -E 'say --$| for (1..10)'»
>
>
> diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c
> index ef9148d7b..179ac068e 100644
> --- a/Src/Modules/parameter.c
> +++ b/Src/Modules/parameter.c
> @@ -2136,6 +2136,24 @@ scanpmusergroups(UNUSED(HashTable ht), ScanFunc func,
> int flags)
>  }
>
>
> +/* Functions for the AUTOINCREMENT special parameter. */
> +
> +static zlong autoincrement = 0;
> +
> +static zlong
> +autoincrementgetfn(UNUSED(Param pm))
> +{
> +    return autoincrement++;
> +}
> +
> +static void
> +autoincrementsetfn(UNUSED(Param pm), zlong value)
> +{
> +    autoincrement = value;
> +}

If someone hypothetically wanted to use this, this (eg, the static
zlong autoincrement variable) should either be a zulong, or
autoincrementgetfn should check for wrapping, otherwise this is
undefined behavior (hypothetically) (unless we use -fwrapv, but I
don't think we do).

-- 
Mikael Magnusson




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