Shortening trees list with (setcdr (nthcdr 2 trees) nil) Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?When to use quote for lists? Modifying quoted lists in ElispApply function to a list until first success (non-nil) and return this valueHow to quote for multiple levels of macro expansionhow to access/print a list of a list?List manipulation — appending duplicate equal listsReport duplicates in a list?how to specify an infinite list in lisp?How to pop an arbitrary element from a list?How do I rotate list elements?List variable that is set to one list or another depending on conditionHow to write a list literal with conditional items?
Simulate round-robin tournament draw
How to translate "red flag" into Spanish?
Why does Java have support for time zone offsets with seconds precision?
What *exactly* is electrical current, voltage, and resistance?
Is it appropriate to mention a relatable company blog post when you're asked about the company?
Will I lose my paid in full property
Was Objective-C really a hindrance to Apple software development?
Is it OK if I do not take the receipt in Germany?
Where/What are Arya's scars from?
Israeli soda type drink
Coin Game with infinite paradox
What's the difference between using dependency injection with a container and using a service locator?
Is there an efficient way for synchronising audio events real-time with LEDs using an MCU?
What is /etc/mtab in Linux?
All ASCII characters with a given bit count
Are there existing rules/lore for MTG planeswalkers?
Suing a Police Officer Instead of the Police Department
How to keep bees out of canned beverages?
Does using the Inspiration rules for character defects encourage My Guy Syndrome?
What is the evidence that custom checks in Northern Ireland are going to result in violence?
Will temporary Dex penalties prevent you from getting the benefits of the "Two Weapon Fighting" feat if your Dex score falls below the prerequisite?
Is there a possibility to generate a list dynamically in Latex?
Is there a verb for listening stealthily?
France's Public Holidays' Puzzle
Shortening trees list with (setcdr (nthcdr 2 trees) nil)
Announcing the arrival of Valued Associate #679: Cesar Manara
Unicorn Meta Zoo #1: Why another podcast?When to use quote for lists? Modifying quoted lists in ElispApply function to a list until first success (non-nil) and return this valueHow to quote for multiple levels of macro expansionhow to access/print a list of a list?List manipulation — appending duplicate equal listsReport duplicates in a list?how to specify an infinite list in lisp?How to pop an arbitrary element from a list?How do I rotate list elements?List variable that is set to one list or another depending on conditionHow to write a list literal with conditional items?
I am starting to learn elisp and working through this tutorial https://www.gnu.org/software/emacs/manual/html_node/eintr/kill_002dnew-function.html
and I do not understand this basic example:
(setq trees '(maple oak pine birch))
⇒ (maple oak pine birch)
(setcdr (nthcdr 2 trees) nil)
⇒ nil
trees
⇒ (maple oak pine) ;I was expecting: (pine)
How does (setcdr (nthcdr 2 trees) nil) remove the last element from the trees list?
Here is the same example manually expanded from the inside out:
(setq trees '(maple oak pine birch))
⇒ (maple oak pine birch)
(nthcdr 2 trees)
⇒ (pine birch)
(setq trees '(pine birch))
⇒ (pine birch)
(setcdr trees nil)
trees
⇒ (pine)
Where did I go wrong expanding the example?
elisp list lisp
add a comment |
I am starting to learn elisp and working through this tutorial https://www.gnu.org/software/emacs/manual/html_node/eintr/kill_002dnew-function.html
and I do not understand this basic example:
(setq trees '(maple oak pine birch))
⇒ (maple oak pine birch)
(setcdr (nthcdr 2 trees) nil)
⇒ nil
trees
⇒ (maple oak pine) ;I was expecting: (pine)
How does (setcdr (nthcdr 2 trees) nil) remove the last element from the trees list?
Here is the same example manually expanded from the inside out:
(setq trees '(maple oak pine birch))
⇒ (maple oak pine birch)
(nthcdr 2 trees)
⇒ (pine birch)
(setq trees '(pine birch))
⇒ (pine birch)
(setcdr trees nil)
trees
⇒ (pine)
Where did I go wrong expanding the example?
elisp list lisp
add a comment |
I am starting to learn elisp and working through this tutorial https://www.gnu.org/software/emacs/manual/html_node/eintr/kill_002dnew-function.html
and I do not understand this basic example:
(setq trees '(maple oak pine birch))
⇒ (maple oak pine birch)
(setcdr (nthcdr 2 trees) nil)
⇒ nil
trees
⇒ (maple oak pine) ;I was expecting: (pine)
How does (setcdr (nthcdr 2 trees) nil) remove the last element from the trees list?
Here is the same example manually expanded from the inside out:
(setq trees '(maple oak pine birch))
⇒ (maple oak pine birch)
(nthcdr 2 trees)
⇒ (pine birch)
(setq trees '(pine birch))
⇒ (pine birch)
(setcdr trees nil)
trees
⇒ (pine)
Where did I go wrong expanding the example?
elisp list lisp
I am starting to learn elisp and working through this tutorial https://www.gnu.org/software/emacs/manual/html_node/eintr/kill_002dnew-function.html
and I do not understand this basic example:
(setq trees '(maple oak pine birch))
⇒ (maple oak pine birch)
(setcdr (nthcdr 2 trees) nil)
⇒ nil
trees
⇒ (maple oak pine) ;I was expecting: (pine)
How does (setcdr (nthcdr 2 trees) nil) remove the last element from the trees list?
Here is the same example manually expanded from the inside out:
(setq trees '(maple oak pine birch))
⇒ (maple oak pine birch)
(nthcdr 2 trees)
⇒ (pine birch)
(setq trees '(pine birch))
⇒ (pine birch)
(setcdr trees nil)
trees
⇒ (pine)
Where did I go wrong expanding the example?
elisp list lisp
elisp list lisp
edited Apr 17 at 13:39
Drew
49.4k463108
49.4k463108
asked Apr 17 at 6:20
wolfvwolfv
559217
559217
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
Formal answer
In your expanded example you set the variable trees
to a new value in:
(setq trees '(pine birch))
That is not what happens in the original example. In the original example really the cdr of (nthcdr 2 trees)
is set.
If you want to assign the intermediate value to a variable for better understanding you should introduce a new one, e.g., trees-tail
would be an appropriate name:
(setq trees '(maple oak pine birch))
;; ⇒ (maple oak pine birch)
(setq trees-tail (nthcdr 2 trees))
;; ⇒ (pine birch)
(setcdr trees-tail nil)
;; trees-tail ⇒ (pine)
trees
;; ⇒ (maple oak pine)
Additional explanation
Note that lists are actually linked lists of conses. A cons is a construct of two cells, named car and cdr. The car is used for the value of the cons and the cdr is used to link to the next cons or it is set to nil to signal the end of the list.
After setting the value of trees
to the list (maple oak pine birch)
you have the following structure of linked conses:
The two-parted rectangles are the conses. The first part is the car the second is the cdr.
The value of trees
just refers to the first cons of the list.
After setting trees-tail
to the second cdr of the value of trees
it also points to the pine
-cons:
If we now set the cdr of trees-tail
to nil we break the link to the birch
-cons. That cons is no longer referred to by any variable or link and will be removed through the next garbage-collect
.
Additional Remarks
The car and the cdr of a cons are actually cells of the same structure. You can also set the car as link and get a tree structure instead of a list.
Example:(setq trees '(maple (birch) pine))
You can set the cdr of the last cons to a value instead of nil. Such a structure is called a dotted list.
Example: `(setq trees '(maple oak pine . birch))In Common Lisp you shouldn't modify quoted lists (i.e., constant lists).
Instead of(setq trees '(maple oak pine birch))
you would use(setq trees (list 'maple 'oak 'pine 'pirch))
or(setq trees (copy-list '(maple oak pine birch)))
The reason for that is the common subexpression optimization of lisp compilers.
The rules for Emacs lisp in that respect are not clearly stated in the Emacs lisp manual. There is already a discussion about that in another emacs.se question.
But since there are examples of structure modifications of quoted lists in the Elisp manual you are currently on the safe side.
Be aware that this might change in the future.
Why does running (setcdr trees-tail nil) change the value of trees?
– wolfv
Apr 17 at 8:29
@wolfv I've added some explanation with pictures. Does that help?
– Tobias
Apr 17 at 9:15
What a great explanation. Thank you for your help.
– wolfv
Apr 17 at 10:46
There are some similar diagrams in the Elisp Intro manual, but in the chapter following the one @wolfv is asking about: (eintr) Lists diagrammed. I wonder if it would make sense to reorder.
– npostavs
Apr 17 at 11:10
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "583"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2femacs.stackexchange.com%2fquestions%2f48977%2fshortening-trees-list-with-setcdr-nthcdr-2-trees-nil%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Formal answer
In your expanded example you set the variable trees
to a new value in:
(setq trees '(pine birch))
That is not what happens in the original example. In the original example really the cdr of (nthcdr 2 trees)
is set.
If you want to assign the intermediate value to a variable for better understanding you should introduce a new one, e.g., trees-tail
would be an appropriate name:
(setq trees '(maple oak pine birch))
;; ⇒ (maple oak pine birch)
(setq trees-tail (nthcdr 2 trees))
;; ⇒ (pine birch)
(setcdr trees-tail nil)
;; trees-tail ⇒ (pine)
trees
;; ⇒ (maple oak pine)
Additional explanation
Note that lists are actually linked lists of conses. A cons is a construct of two cells, named car and cdr. The car is used for the value of the cons and the cdr is used to link to the next cons or it is set to nil to signal the end of the list.
After setting the value of trees
to the list (maple oak pine birch)
you have the following structure of linked conses:
The two-parted rectangles are the conses. The first part is the car the second is the cdr.
The value of trees
just refers to the first cons of the list.
After setting trees-tail
to the second cdr of the value of trees
it also points to the pine
-cons:
If we now set the cdr of trees-tail
to nil we break the link to the birch
-cons. That cons is no longer referred to by any variable or link and will be removed through the next garbage-collect
.
Additional Remarks
The car and the cdr of a cons are actually cells of the same structure. You can also set the car as link and get a tree structure instead of a list.
Example:(setq trees '(maple (birch) pine))
You can set the cdr of the last cons to a value instead of nil. Such a structure is called a dotted list.
Example: `(setq trees '(maple oak pine . birch))In Common Lisp you shouldn't modify quoted lists (i.e., constant lists).
Instead of(setq trees '(maple oak pine birch))
you would use(setq trees (list 'maple 'oak 'pine 'pirch))
or(setq trees (copy-list '(maple oak pine birch)))
The reason for that is the common subexpression optimization of lisp compilers.
The rules for Emacs lisp in that respect are not clearly stated in the Emacs lisp manual. There is already a discussion about that in another emacs.se question.
But since there are examples of structure modifications of quoted lists in the Elisp manual you are currently on the safe side.
Be aware that this might change in the future.
Why does running (setcdr trees-tail nil) change the value of trees?
– wolfv
Apr 17 at 8:29
@wolfv I've added some explanation with pictures. Does that help?
– Tobias
Apr 17 at 9:15
What a great explanation. Thank you for your help.
– wolfv
Apr 17 at 10:46
There are some similar diagrams in the Elisp Intro manual, but in the chapter following the one @wolfv is asking about: (eintr) Lists diagrammed. I wonder if it would make sense to reorder.
– npostavs
Apr 17 at 11:10
add a comment |
Formal answer
In your expanded example you set the variable trees
to a new value in:
(setq trees '(pine birch))
That is not what happens in the original example. In the original example really the cdr of (nthcdr 2 trees)
is set.
If you want to assign the intermediate value to a variable for better understanding you should introduce a new one, e.g., trees-tail
would be an appropriate name:
(setq trees '(maple oak pine birch))
;; ⇒ (maple oak pine birch)
(setq trees-tail (nthcdr 2 trees))
;; ⇒ (pine birch)
(setcdr trees-tail nil)
;; trees-tail ⇒ (pine)
trees
;; ⇒ (maple oak pine)
Additional explanation
Note that lists are actually linked lists of conses. A cons is a construct of two cells, named car and cdr. The car is used for the value of the cons and the cdr is used to link to the next cons or it is set to nil to signal the end of the list.
After setting the value of trees
to the list (maple oak pine birch)
you have the following structure of linked conses:
The two-parted rectangles are the conses. The first part is the car the second is the cdr.
The value of trees
just refers to the first cons of the list.
After setting trees-tail
to the second cdr of the value of trees
it also points to the pine
-cons:
If we now set the cdr of trees-tail
to nil we break the link to the birch
-cons. That cons is no longer referred to by any variable or link and will be removed through the next garbage-collect
.
Additional Remarks
The car and the cdr of a cons are actually cells of the same structure. You can also set the car as link and get a tree structure instead of a list.
Example:(setq trees '(maple (birch) pine))
You can set the cdr of the last cons to a value instead of nil. Such a structure is called a dotted list.
Example: `(setq trees '(maple oak pine . birch))In Common Lisp you shouldn't modify quoted lists (i.e., constant lists).
Instead of(setq trees '(maple oak pine birch))
you would use(setq trees (list 'maple 'oak 'pine 'pirch))
or(setq trees (copy-list '(maple oak pine birch)))
The reason for that is the common subexpression optimization of lisp compilers.
The rules for Emacs lisp in that respect are not clearly stated in the Emacs lisp manual. There is already a discussion about that in another emacs.se question.
But since there are examples of structure modifications of quoted lists in the Elisp manual you are currently on the safe side.
Be aware that this might change in the future.
Why does running (setcdr trees-tail nil) change the value of trees?
– wolfv
Apr 17 at 8:29
@wolfv I've added some explanation with pictures. Does that help?
– Tobias
Apr 17 at 9:15
What a great explanation. Thank you for your help.
– wolfv
Apr 17 at 10:46
There are some similar diagrams in the Elisp Intro manual, but in the chapter following the one @wolfv is asking about: (eintr) Lists diagrammed. I wonder if it would make sense to reorder.
– npostavs
Apr 17 at 11:10
add a comment |
Formal answer
In your expanded example you set the variable trees
to a new value in:
(setq trees '(pine birch))
That is not what happens in the original example. In the original example really the cdr of (nthcdr 2 trees)
is set.
If you want to assign the intermediate value to a variable for better understanding you should introduce a new one, e.g., trees-tail
would be an appropriate name:
(setq trees '(maple oak pine birch))
;; ⇒ (maple oak pine birch)
(setq trees-tail (nthcdr 2 trees))
;; ⇒ (pine birch)
(setcdr trees-tail nil)
;; trees-tail ⇒ (pine)
trees
;; ⇒ (maple oak pine)
Additional explanation
Note that lists are actually linked lists of conses. A cons is a construct of two cells, named car and cdr. The car is used for the value of the cons and the cdr is used to link to the next cons or it is set to nil to signal the end of the list.
After setting the value of trees
to the list (maple oak pine birch)
you have the following structure of linked conses:
The two-parted rectangles are the conses. The first part is the car the second is the cdr.
The value of trees
just refers to the first cons of the list.
After setting trees-tail
to the second cdr of the value of trees
it also points to the pine
-cons:
If we now set the cdr of trees-tail
to nil we break the link to the birch
-cons. That cons is no longer referred to by any variable or link and will be removed through the next garbage-collect
.
Additional Remarks
The car and the cdr of a cons are actually cells of the same structure. You can also set the car as link and get a tree structure instead of a list.
Example:(setq trees '(maple (birch) pine))
You can set the cdr of the last cons to a value instead of nil. Such a structure is called a dotted list.
Example: `(setq trees '(maple oak pine . birch))In Common Lisp you shouldn't modify quoted lists (i.e., constant lists).
Instead of(setq trees '(maple oak pine birch))
you would use(setq trees (list 'maple 'oak 'pine 'pirch))
or(setq trees (copy-list '(maple oak pine birch)))
The reason for that is the common subexpression optimization of lisp compilers.
The rules for Emacs lisp in that respect are not clearly stated in the Emacs lisp manual. There is already a discussion about that in another emacs.se question.
But since there are examples of structure modifications of quoted lists in the Elisp manual you are currently on the safe side.
Be aware that this might change in the future.
Formal answer
In your expanded example you set the variable trees
to a new value in:
(setq trees '(pine birch))
That is not what happens in the original example. In the original example really the cdr of (nthcdr 2 trees)
is set.
If you want to assign the intermediate value to a variable for better understanding you should introduce a new one, e.g., trees-tail
would be an appropriate name:
(setq trees '(maple oak pine birch))
;; ⇒ (maple oak pine birch)
(setq trees-tail (nthcdr 2 trees))
;; ⇒ (pine birch)
(setcdr trees-tail nil)
;; trees-tail ⇒ (pine)
trees
;; ⇒ (maple oak pine)
Additional explanation
Note that lists are actually linked lists of conses. A cons is a construct of two cells, named car and cdr. The car is used for the value of the cons and the cdr is used to link to the next cons or it is set to nil to signal the end of the list.
After setting the value of trees
to the list (maple oak pine birch)
you have the following structure of linked conses:
The two-parted rectangles are the conses. The first part is the car the second is the cdr.
The value of trees
just refers to the first cons of the list.
After setting trees-tail
to the second cdr of the value of trees
it also points to the pine
-cons:
If we now set the cdr of trees-tail
to nil we break the link to the birch
-cons. That cons is no longer referred to by any variable or link and will be removed through the next garbage-collect
.
Additional Remarks
The car and the cdr of a cons are actually cells of the same structure. You can also set the car as link and get a tree structure instead of a list.
Example:(setq trees '(maple (birch) pine))
You can set the cdr of the last cons to a value instead of nil. Such a structure is called a dotted list.
Example: `(setq trees '(maple oak pine . birch))In Common Lisp you shouldn't modify quoted lists (i.e., constant lists).
Instead of(setq trees '(maple oak pine birch))
you would use(setq trees (list 'maple 'oak 'pine 'pirch))
or(setq trees (copy-list '(maple oak pine birch)))
The reason for that is the common subexpression optimization of lisp compilers.
The rules for Emacs lisp in that respect are not clearly stated in the Emacs lisp manual. There is already a discussion about that in another emacs.se question.
But since there are examples of structure modifications of quoted lists in the Elisp manual you are currently on the safe side.
Be aware that this might change in the future.
edited Apr 17 at 11:10
answered Apr 17 at 8:11
TobiasTobias
15.5k11035
15.5k11035
Why does running (setcdr trees-tail nil) change the value of trees?
– wolfv
Apr 17 at 8:29
@wolfv I've added some explanation with pictures. Does that help?
– Tobias
Apr 17 at 9:15
What a great explanation. Thank you for your help.
– wolfv
Apr 17 at 10:46
There are some similar diagrams in the Elisp Intro manual, but in the chapter following the one @wolfv is asking about: (eintr) Lists diagrammed. I wonder if it would make sense to reorder.
– npostavs
Apr 17 at 11:10
add a comment |
Why does running (setcdr trees-tail nil) change the value of trees?
– wolfv
Apr 17 at 8:29
@wolfv I've added some explanation with pictures. Does that help?
– Tobias
Apr 17 at 9:15
What a great explanation. Thank you for your help.
– wolfv
Apr 17 at 10:46
There are some similar diagrams in the Elisp Intro manual, but in the chapter following the one @wolfv is asking about: (eintr) Lists diagrammed. I wonder if it would make sense to reorder.
– npostavs
Apr 17 at 11:10
Why does running (setcdr trees-tail nil) change the value of trees?
– wolfv
Apr 17 at 8:29
Why does running (setcdr trees-tail nil) change the value of trees?
– wolfv
Apr 17 at 8:29
@wolfv I've added some explanation with pictures. Does that help?
– Tobias
Apr 17 at 9:15
@wolfv I've added some explanation with pictures. Does that help?
– Tobias
Apr 17 at 9:15
What a great explanation. Thank you for your help.
– wolfv
Apr 17 at 10:46
What a great explanation. Thank you for your help.
– wolfv
Apr 17 at 10:46
There are some similar diagrams in the Elisp Intro manual, but in the chapter following the one @wolfv is asking about: (eintr) Lists diagrammed. I wonder if it would make sense to reorder.
– npostavs
Apr 17 at 11:10
There are some similar diagrams in the Elisp Intro manual, but in the chapter following the one @wolfv is asking about: (eintr) Lists diagrammed. I wonder if it would make sense to reorder.
– npostavs
Apr 17 at 11:10
add a comment |
Thanks for contributing an answer to Emacs Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2femacs.stackexchange.com%2fquestions%2f48977%2fshortening-trees-list-with-setcdr-nthcdr-2-trees-nil%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown