Reputation: 319
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
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