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

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

Re: Two questions about generalized variables


From: Eric Abrahamsen
Subject: Re: Two questions about generalized variables
Date: Sun, 21 Feb 2016 23:01:48 +0800
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1.50 (gnu/linux)

Michael Heerdegen <michael_heerdegen@web.de> writes:

> Eric Abrahamsen <eric@ericabrahamsen.net> writes:
>
>> It looks like plist-get doesn't return a setf-able place.
>
> But `symbol-plist' has a gv-expander and refers to an alist.
> `alist-get' has a gv-expander, too.  So i think you would end up with
> something like
>
>   (setf (alist-get key (symbol-plist 'symbol)) value)
>
> I think.

I didn't mean symbol property lists! Just the plain old '(:key1 "value1"
:key2 "value2") kind. They're useful for a few different things -- in
this case, initializing class instances.

>> The second question is setting hashtable entries. Right now I have code
>> like this:
>>
>> (setf (gethash uuid my-hashtable)
>>       (append (list (list 'thingone 'thingtwo))
>>               (gethash uuid my-hashtable)))
>
> Isn't that more or less `push'?

I started off with `push', but the code in question doesn't know if the
key exists or not, and you can't push to nil. Once you've checked
whether the key has a value or not, you might as well be doing
gethash/puthash.

>> I assume this is no more or less efficient than let-ting the gethash,
>> manipulating the value, then using puthash to put it back in. Now I've
>> written this:
>
>> [corrected version from the second message]
>> (cl-symbol-macrolet ((entry (gethash uuid my-hashtable)))
>>   (setf entry (append (list (list 'thingone 'thingtwo))
>>                    entry)))
>>
>> This is a simplistic example, but -- is this actually going to be any
>> faster or more efficient than the first version? Does it only access
>> the hashtable once?
>
> `push' with `gethash' and the above code expand more or less to the
> same.  And I think this must access the hash-table twice: once
> `gethash', and once `puthash'.

Right, I would assume that "(push (list ...) (gethash uuid
my-hashtable))" is as efficient as you can get. But I don't think I can
use it.

But your response nudged me in the right direction -- of course I should
have simply expanded the macro to see what it does. And indeed the
`cl-symbol-macrolet' phrase expands to a `puthash' plus a `gethash'. So
that's my answer -- I guess it's just a syntactic convenience.

Thanks!
Eric




reply via email to

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