nth ¶nthcdr 函数对列表重复执行 CDR。而 nth 函数会对 nthcdr 返回的结果再执行 CAR,它返回列表的第 N 个元素。
因此,如果不是为了效率用 C 语言重新实现,nth 的定义大致如下:
(defun nth (n list) "返回列表 LIST 的第 N 个元素。 N 从 0 开始计数。若列表长度不足,返回 nil。" (car (nthcdr n list)))
(最初 nth 是在 Emacs Lisp 的 subr.el 中定义的,后来在 1980 年代改用 C 语言重新实现。)
nth 函数返回列表中的单个元素,使用起来非常方便。
注意元素编号从 0 开始,而非从 1 开始。也就是说,列表的第一个元素(CAR)是第 0 个元素。这种从 0 开始的计数方式,常常让习惯从 1 开始计数的人感到不适。
例如:
(nth 0 '("one" "two" "three"))
⇒ "one"
(nth 1 '("one" "two" "three"))
⇒ "two"
值得一提的是,nth 与 nthcdr、cdr 一样,不会修改原列表——该函数是非破坏性的。这与 setcar 和 setcdr 函数形成鲜明对比。