Xaving
Xaving

Reputation: 319

Get cdr of an elt in a list

I use 2 methods to build a tree based on cons cells.

(defun make-tree (nodes)
  (cons nodes NIL))

(defun add-child (tree child)
  (setf (cdr tree) (append (cdr tree) child)))

Then I created 4 parameters:

(defparameter *root* (make-tree "root"))
(defparameter *a* (make-tree "a"))
(defparameter *b* (make-tree "b"))
(defparameter *c* (make-tree "c"))

And I construct the following tree:

(add-child *root* *a*)
(add-child *root* *b*)
(add-child *a* *c*)

The *root* is displayed in the console:

CL-USER> *root*
("root" "a" "b")

My question is: Is it possible to retrieve c from *root*? Something like: (cdr (car (cdr *root*))) returns an error.

Upvotes: 0

Views: 83

Answers (1)

Barmar
Barmar

Reputation: 781210

You need to use NCONC rather than APPEND in ADD-CHILD, so you don't make copies of the subtrees.

(defun add-child (tree child)
  (setf (cdr tree) (append (cdr tree) child)))

With this change, after I do all the other steps, I get:

> *root*
("root" "a" "b" "c")
> (car (cdr (cdr (cdr *root*))))
"c"
> (cadddr *root*)
"c"

Upvotes: 1

Related Questions