3.6 存取 (Access)
Common Lisp 有额外的存取函数,它们是用 car
跟 cdr
所定义的。要找到列表特定位置的元素,我们可以调用 nth
,
> (nth 0 '(a b c))
A
而要找到第 n
个 cdr
,我们调用 nthcdr
:
> (nthcdr 2 '(a b c))
(C)
nth
与 nthcdr
都是零索引的 (zero-indexed); 即元素从 0
开始编号,而不是从 1
开始。在 Common Lisp 里,无论何时你使用一个数字来参照一个数据结构中的元素时,都是从 0
开始编号的。
两个函数几乎做一样的事; nth
等同于取 nthcdr
的 car
。没有检查错误的情况下, nthcdr
可以这么定义:
(defun our-nthcdr (n lst)
(if (zerop n)
lst
(our-nthcdr (- n 1) (cdr lst))))
函数 zerop
仅在参数为零时,才返回真。
函数 last
返回列表的最后一个 Cons 对象:
> (last '(a b c))
(C)
这跟取得最后一个元素不一样。要取得列表的最后一个元素,你要取得 last
的 car
。
Common Lisp 定义了函数 first
直到 tenth
可以取得列表对应的元素。这些函数不是 零索引的 (zero-indexed):
(second x)
等同于 (nth 1 x)
。
此外, Common Lisp 定义了像是 caddr
这样的函数,它是 cdr
的 cdr
的 car
的缩写 ( car
of cdr
of cdr
)。所有这样形式的函数 cxr
,其中 x 是一个字符串,最多四个 a
或 d
,在 Common Lisp 里都被定义好了。使用 cadr
可能会有异常 (exception)产生,在所有人都可能会读的代码里使用这样的函数,可能不是个好主意。
当前内容版权归 readthedocs 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 readthedocs .