在列表中获取elt的cdr

时间:2014-07-31 09:15:09

标签: lisp common-lisp

我使用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*)))会返回错误。

1 个答案:

答案 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"