From: "Pascal J. Bourguignon" <pjb@informatimago.com>
To: help-gnu-emacs@gnu.org
Subject: Re: Why doesn't nconc change my variable?
Date: Sun, 05 Oct 2014 20:31:29 +0200 [thread overview]
Message-ID: <877g0emkqm.fsf@kuiper.lan.informatimago.com> (raw)
In-Reply-To: mailman.10475.1412502895.1147.help-gnu-emacs@gnu.org
Marcin Borkowski <mbork@wmi.amu.edu.pl> writes:
> (Now that I'm wondering what the implementation might actually be, I'm
> more and more tempted to look at the C source. This is probably a good
> sign.)
Instead, look at the lisp source! ;-)
(defun .nconc (&rest lists)
(let ((lists (do ((curlists lists (rest lists)))
((or (null curlists) (first curlists))
curlists))))
(when lists
(let ((current (first lists)))
(dolist (next (rest lists)
(when next
(setf (cdr (last current)) next
current next)))))))
(.nconc (list 1 2 3) (list 4 5 6) (list 7 8 9))
--> (1 2 3 4 5 6 7 8 9)
(.nconc (list 1 2 3) nil (list 4 5 6))
--> (1 2 3 4 5 6)
(.nconc (list 1 2 3) nil)
--> (1 2 3)
(.nconc nil (list 1 2 3))
--> (1 2 3)
(.nconc nil)
--> nil
> 1. Do I get it correctly that the "destructiveness" of some functions
> (like nconc) does /not/ mean that they /change/ some of their arguments,
> but only that they /may/ do it, and that relying on that is risky?
Yes.
> 2. Do I get it correctly that what Pascal called "a nil symbol" is just
> NUL under the hood?
No.
> Does it mean that there's no difference between (),
> nil and the result of (list) (as opposed to the results of calling list
> twice with the same arguments)? (They seem to be `eq', as I've just
> checked.)
If they're eq then there's no difference.
It's the lisp reader that reads () as nil:
(car (read-from-string "()")) --> nil
(car (read-from-string "nil")) --> nil
(car (read-from-string "(list)")) --> (list)
It's the lisp evaluator that calls list and have it return nil, just
like nil, since nil is bound to nil:
(symbol-value 'nil) --> nil
(eval 'nil) --> nil
(eval '(list)) --> nil
> 3. What is the "canonical" way to append an element to a list, in the
> sense that I have a variable containing (=pointing to?) a list, I want
> it to point to a list one element longer? And, while at that, what is
> the "canonical" way to /prepend/ an element to a list (is it `push'?)
(setf list (nconc list (list new-element)))
> 4. (This is the suggestion.) If the above is right, could someone make
> it more clear in the manual (or point me to the place in the manual
> where it is actually stated)?
Your above was wrong, so no. ;-)
I guess these things are explained more pedagogically in (info "(eintr)")
and notably in (info "(eintr) List Implementation")
--
__Pascal Bourguignon__ http://www.informatimago.com/
“The factory of the future will have only two employees, a man and a
dog. The man will be there to feed the dog. The dog will be there to
keep the man from touching the equipment.” -- Carl Bass CEO Autodesk
next prev parent reply other threads:[~2014-10-05 18:31 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-05 1:36 Why doesn't nconc change my variable? Marcin Borkowski
2014-10-05 1:58 ` Drew Adams
2014-10-05 9:54 ` Marcin Borkowski
2014-10-05 10:52 ` Thorsten Jolitz
2014-10-05 16:29 ` Drew Adams
2014-10-05 16:38 ` Drew Adams
[not found] ` <mailman.10475.1412502895.1147.help-gnu-emacs@gnu.org>
2014-10-05 18:12 ` Pascal J. Bourguignon
2014-10-05 18:14 ` Pascal J. Bourguignon
2014-10-05 18:31 ` Pascal J. Bourguignon [this message]
[not found] <mailman.10460.1412473030.1147.help-gnu-emacs@gnu.org>
2014-10-05 1:59 ` Pascal J. Bourguignon
2014-10-05 9:35 ` Marcin Borkowski
[not found] ` <mailman.10474.1412501757.1147.help-gnu-emacs@gnu.org>
2014-10-05 17:50 ` Pascal J. Bourguignon
2014-10-05 18:04 ` Pascal J. Bourguignon
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=877g0emkqm.fsf@kuiper.lan.informatimago.com \
--to=pjb@informatimago.com \
--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.
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.