我使用2种方法构建基于cons单元格的树。
(defun make-tree (nodes)
(cons nodes NIL))
(defun add-child (tree child)
(setf (cdr tree) (append (cdr tree) child)))
然后我创建了4个参数:
(defparameter *root* (make-tree "root"))
(defparameter *a* (make-tree "a"))
(defparameter *b* (make-tree "b"))
(defparameter *c* (make-tree "c"))
我构建了以下树:
(add-child *root* *a*)
(add-child *root* *b*)
(add-child *a* *c*)
控制台中显示*root*
:
CL-USER> *root*
("root" "a" "b")
我的问题是:是否可以从c
检索*root*
?类似于:(cdr (car (cdr *root*)))
会返回错误。
答案 0 :(得分:1)
您需要在NCONC
中使用APPEND
而不是ADD-CHILD
,因此您不能复制子树。
(defun add-child (tree child)
(setf (cdr tree) (append (cdr tree) child)))
有了这个改变,在我完成所有其他步骤之后,我得到了:
> *root*
("root" "a" "b" "c")
> (car (cdr (cdr (cdr *root*))))
"c"
> (cadddr *root*)
"c"