7.4 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"

值得一提的是,nthnthcdrcdr 一样,不会修改原列表——该函数是非破坏性的。这与 setcarsetcdr 函数形成鲜明对比。