为什么以下代码段打印nil
而不是最后一个元素?
(progn
(setq lst '(3 5 7))
(while (not (equal lst (car lst)))
(setq lst (cdr lst)))
;; BODY
(print lst))
注意:我需要以不同于列表其余部分的方式处理最后一个元素。
答案 0 :(得分:1)
因为最后一个元素的cdr
是nil
,并且您要将变量设置为该值。
通常,每个car
的{{1}}是一个值(可以是指向另一个列表的指针),cons
是指向列表其余部分的指针。因此,当遍历列表时,您通常希望对cdr
进行操作。
car
任何基本的Lisp介绍都会有比我更好的可视化,但是如果你读过一个,这应该看起来很熟悉。列表的基本构建块是具有(progn
(setq lst '(3 5 7))
(while (cdr lst))
(setq lst (cdr lst)))
(print (car lst)))
和car
的cons单元(名称显然是在第一个Lisp实现中使用的寄存器名称的保留)。
cdr
你的三个元素列表将有三个结果; +------+------+
| car | cdr |
+------+------+
或图形
(3 . (5 . (7 . nil)))
因此,第一个缺点的+---+---+ +---+---+ +---+---+
| . | o--->| . | o--->| . | o---#
+-v-+---+ +-v-+---+ +-v-+---+
3 5 7
是(指向)值3,其car
是(指向)列表中的下一个cdr
。