help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: plist-put: destructive?


From: Eric Abrahamsen
Subject: Re: plist-put: destructive?
Date: Sat, 21 Jan 2017 16:50:53 -0800
User-agent: Gnus/5.130014 (Ma Gnus v0.14) Emacs/26.0.50 (gnu/linux)

Drew Adams <drew.adams@oracle.com> writes:

>> Thanks to you both. I'm working with existing plists, so I'll drop
>> the setqs, that's a relief.
>
> Why is it a relief - a relief from what?  What if something reset your 
> "existing plist" to nil behind your back?

The code I'm working has many repeated clauses looking like:

(when thing1
  (setq the-plist (plist-put the-plist :thing thing1)))

A little more complicated than that, but there will be like seven of
those in a row. Probably I should just write myself a custom
bulk-conditional-plist-setter macro, probably using the gv setter, but
for the time being just being able to remove all the "(setq the-plist"
makes everything easier to read.

> Setting (again) a variable whose value is an object to which you've
> applied a destructive operation is the standard idiom. And it is good
> programming practice. It ensures that your code does what you expect,
> regardless of the object value, or rather, regardless of the effect of
> the operation.
>
> You naturally think of your variable as always pointing to the object that 
> you expect.  To keep this relationship, you must set the variable to the 
> return value of any destructive operation.
>
> This is true for a possibly "destructive" operation on any kind of object.  
> The poster-child case is a list.  See, for example, (elisp) `Rearrangement' 
> (http://www.gnu.org/software/emacs/manual/html_node/elisp/Rearrangement.html).
>
> The point is that your variable is otherwise not guaranteed to
> continue to point to the object that you think it does. You need to
> set it to the _result_ of the possibly destructive operation (the
> return value), if you really want the variable to take the effect of
> that operation into account.
>
> This is all about the difference between a variable and its object value.

I understand the difference, but in this particular case I'm willing to
drop the setqs.

Eric




reply via email to

[Prev in Thread] Current Thread [Next in Thread]