From: Eric Abrahamsen <eric@ericabrahamsen.net>
To: help-gnu-emacs@gnu.org
Subject: Re: Two questions about generalized variables
Date: Sun, 21 Feb 2016 23:01:48 +0800 [thread overview]
Message-ID: <877fhyayzn.fsf@ericabrahamsen.net> (raw)
In-Reply-To: 877fhydw6q.fsf@web.de
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
next prev parent reply other threads:[~2016-02-21 15:01 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-21 5:16 Two questions about generalized variables Eric Abrahamsen
2016-02-21 8:08 ` Eric Abrahamsen
2016-02-21 13:34 ` Michael Heerdegen
2016-02-21 15:01 ` Eric Abrahamsen [this message]
2016-02-21 18:08 ` Michael Heerdegen
2016-02-23 3:19 ` Eric Abrahamsen
2016-02-23 13:28 ` Michael Heerdegen
2016-02-24 2:03 ` Eric Abrahamsen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=877fhyayzn.fsf@ericabrahamsen.net \
--to=eric@ericabrahamsen.net \
--cc=help-gnu-emacs@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).