From: Robin Tarsiger <rtt@dasyatidae.com>
To: Arthur Miller <arthur.miller@live.com>
Cc: emacs-devel@gnu.org
Subject: Re: Lispref add-to-list - doc is unnecessary convoluted
Date: Fri, 4 Dec 2020 09:56:21 -0600 [thread overview]
Message-ID: <b1252cde-bf09-c52a-3fbd-511f3b467a85@dasyatidae.com> (raw)
In-Reply-To: <AM0PR06MB6577A02DF8A6CBD735F3FE8E96F10@AM0PR06MB6577.eurprd06.prod.outlook.com>
Arthur Miller wrote:
> Another question, why doesn't add-to-list take a list value, why symbol?
> Maybe I don't understand lisp enough, but why is this not desirable:
>
> (add-to-list '(1 2 3) '4) or (add-to-list (list 1 2 3) 4)
Because that is not how lists work in Lisp. The idea of a "mutable list"
as a conceptual unit does not fall naturally out of the cons-cell-based
formulation of them. If we were in Python or Java, for instance, a
variable would store a reference to a mutable list object, and passing
the mutable list object into a function to mutate it would be an
acceptable style. But what add-to-list does is construct a new list
(if needed) and store it back into the original location. Lists are
mostly processed without mutation, with any "non-consing" in-place
mutation functions being secondary and not covering all the operations.
(To preempt "Isn't this horribly inefficient?": no, in part because
"adding to" the head of a list involves allocating one cons cell and
the rest of the list is structurally incorporated rather than copied.)
The point where it _sets a variable with a specified name_ in order to
do the mutation is very important both in terms of it being clear what
side effects arise. It does this because add-to-list is intended for
conveniently registering unique entries in lists that are part of global
(or buffer-local) state. For general list manipulation, the docstring
explicitly calls out "please do not abuse it in Elisp code, where you
are usually better off using ‘push’ or ‘cl-pushnew’".
It is not just an "implementation detail". The symbol is not the list.
The variable is not the list. "list" already means something and it
is not that.
LIST-NAME would be potentially sane if everything else had already
used -NAME, but I doubt it's stylistically appropriate. -VAR is clear:
you use it mainly in conjunction with symbols that are set up using defvar.
Calling out the part where it's not setq-like explicitly is useful because
many forms that operate on variables _are_ setq-like, and in particular the
alternatives of push and cl-pushnew are both setq-like and treat the
place argument specially.
> "If that is I want"? :-) If I don't want - is it not needed then? :-)
Consider:
(add-to-list (make-local-variable 'some-lovely-config-list)
'(happy config entry here))
along the lines of the (set (make-local-variable ...) ...) idiom, to
say "do this mutation buffer-locally, by ensuring that the variable
is buffer-local first, without repeating the variable name". This is
not something you can do with the setq-like forms.
-RTT
next prev parent reply other threads:[~2020-12-04 15:56 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-04 2:17 Lispref add-to-list - doc is unnecessary convoluted Arthur Miller
2020-12-04 2:27 ` Christopher Dimech
2020-12-04 2:36 ` Robin Tarsiger
2020-12-04 3:29 ` Arthur Miller
2020-12-04 3:35 ` Arthur Miller
2020-12-04 8:35 ` Lars Ingebrigtsen
2020-12-04 8:29 ` Eli Zaretskii
2020-12-04 15:28 ` Arthur Miller
2020-12-04 15:56 ` Robin Tarsiger [this message]
2020-12-04 16:14 ` Ad-hoc list structure tutorializing (was: Lispref add-to-list - doc is unnecessary convoluted) Robin Tarsiger
2020-12-04 20:24 ` Ad-hoc list structure tutorializing Stefan Monnier
2020-12-04 21:12 ` Christopher Dimech
2020-12-05 7:45 ` Eli Zaretskii
2020-12-06 5:45 ` Richard Stallman
2020-12-06 5:57 ` Robin Tarsiger
2020-12-06 14:01 ` Arthur Miller
2020-12-06 5:39 ` Richard Stallman
2020-12-04 21:40 ` add-to-list vs cl-pushnew Robin Tarsiger
2020-12-04 21:51 ` Robin Tarsiger
2020-12-04 22:47 ` Sv: Ad-hoc list structure tutorializing (was: Lispref add-to-list - doc is unnecessary convoluted) arthur miller
2020-12-04 17:03 ` Lispref add-to-list - doc is unnecessary convoluted Drew Adams
2020-12-04 17:24 ` arthur miller
2020-12-04 18:02 ` Drew Adams
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b1252cde-bf09-c52a-3fbd-511f3b467a85@dasyatidae.com \
--to=rtt@dasyatidae.com \
--cc=arthur.miller@live.com \
--cc=emacs-devel@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.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.