nthcdr ¶nthcdr 函数与 cdr 相关,它的作用是对列表重复执行 CDR 操作。
对列表 (pine fir oak maple) 执行 CDR,会返回列表 (fir oak maple)。对返回结果再次执行 CDR,会返回 (oak maple)。(当然,对原列表重复执行 CDR 只会得到原列表的 CDR,因为函数不会修改列表。需要对 CDR 的结果再执行 CDR,依此类推。)继续执行下去,最终会返回空列表,在本例中不会显示为 (),而是显示为 nil。
作为回顾,下面是一系列重复执行 CDR 的示例,‘⇒’ 后为返回结果:
(cdr '(pine fir oak maple))
⇒ (fir oak maple)
(cdr '(fir oak maple))
⇒ (oak maple)
(cdr '(oak maple))
⇒ (maple)
(cdr '(maple))
⇒ nil
(cdr 'nil)
⇒ nil
(cdr ())
⇒ nil
你也可以连续执行多次 CDR 而不打印中间结果,例如:
(cdr (cdr '(pine fir oak maple)))
⇒ (oak maple)
在本例中,Lisp 解释器先求值最内层列表。该列表被引用,因此直接原样传给内层的 cdr。这个 cdr 将原列表第二个及后续元素组成的列表传给外层 cdr,后者再返回原列表第三个及后续元素组成的列表。本例中 cdr 被重复执行,返回的列表去掉了原列表的前两个元素。
nthcdr 函数的效果等同于重复调用 cdr。下面的例子中,数字 2 和列表一起传给 nthcdr,返回的列表去掉了前两个元素,与对列表执行两次 cdr 的结果完全相同:
(nthcdr 2 '(pine fir oak maple))
⇒ (oak maple)
使用最初的四元素列表,我们可以观察向 nthcdr 传入不同数字参数(包括 0、1 和 5)的效果:
;; 保持列表不变
(nthcdr 0 '(pine fir oak maple))
⇒ (pine fir oak maple)
;; 返回去掉第一个元素的列表副本
(nthcdr 1 '(pine fir oak maple))
⇒ (fir oak maple)
;; 返回去掉前三个元素的列表副本
(nthcdr 3 '(pine fir oak maple))
⇒ (maple)
;; 返回去掉全部四个元素的结果
(nthcdr 4 '(pine fir oak maple))
⇒ nil
;; Return a copy lacking all elements.
(nthcdr 5 '(pine fir oak maple))
⇒ nil