3.6 存取 (Access)

Common Lisp 有额外的存取函数,它们是用 carcdr 所定义的。要找到列表特定位置的元素,我们可以调用 nth

  1. > (nth 0 '(a b c))
  2. A

而要找到第 ncdr ,我们调用 nthcdr

  1. > (nthcdr 2 '(a b c))
  2. (C)

nthnthcdr 都是零索引的 (zero-indexed); 即元素从 0 开始编号,而不是从 1 开始。在 Common Lisp 里,无论何时你使用一个数字来参照一个数据结构中的元素时,都是从 0 开始编号的。

两个函数几乎做一样的事; nth 等同于取 nthcdrcar 。没有检查错误的情况下, nthcdr 可以这么定义:

  1. (defun our-nthcdr (n lst)
  2. (if (zerop n)
  3. lst
  4. (our-nthcdr (- n 1) (cdr lst))))

函数 zerop 仅在参数为零时,才返回真。

函数 last 返回列表的最后一个 Cons 对象:

  1. > (last '(a b c))
  2. (C)

这跟取得最后一个元素不一样。要取得列表的最后一个元素,你要取得 lastcar

Common Lisp 定义了函数 first 直到 tenth 可以取得列表对应的元素。这些函数不是 零索引的 (zero-indexed):

(second x) 等同于 (nth 1 x)

此外, Common Lisp 定义了像是 caddr 这样的函数,它是 cdrcdrcar 的缩写 ( car of cdr of cdr )。所有这样形式的函数 cxr ,其中 x 是一个字符串,最多四个 ad ,在 Common Lisp 里都被定义好了。使用 cadr 可能会有异常 (exception)产生,在所有人都可能会读的代码里使用这样的函数,可能不是个好主意。