elisp的奇怪结果

时间:2015-08-02 18:04:50

标签: elisp

为什么以下代码段打印nil而不是最后一个元素?

(progn
  (setq lst '(3 5 7))
  (while (not (equal lst (car lst)))
    (setq lst (cdr lst)))
  ;; BODY
  (print lst))

注意:我需要以不同于列表其余部分的方式处理最后一个元素。

1 个答案:

答案 0 :(得分:1)

因为最后一个元素的cdrnil,并且您要将变量设置为该值。

通常,每个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