[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