递归模式:every(遍历)

every 递归模式中,会对列表的每一个元素执行某项操作。

基本模式为:

示例如下:

(defun square-each (numbers-list)
  "Square each of a NUMBERS LIST, recursively."
  (if (not numbers-list)                ; do-again-test
      nil
    (cons
     (* (car numbers-list) (car numbers-list))
     (square-each (cdr numbers-list))))) ; next-step-expression

(square-each '(1 2 3))
    ⇒ (1 4 9)

numbers-list 为空,则不执行任何操作。若列表非空,则构造一个新列表,将列表首个数字的平方与递归调用的结果组合在一起。

(该示例严格遵循该模式:数字列表为空时返回 nil。实际使用中,你可以将条件写为在列表非空时执行操作。)

print-elements-recursively 函数(see Recursion with a List)是 every 模式的另一个示例,区别在于本例并非使用 cons 拼接结果,而是逐个打印元素。

print-elements-recursively 函数如下:

(setq animals '(gazelle giraffe lion tiger))

(defun print-elements-recursively (list)
  "Print each element of LIST on a line of its own.
Uses recursion."
  (when list                            ; do-again-test
        (print (car list))              ; body
        (print-elements-recursively     ; recursive call
         (cdr list))))                  ; next-step-expression

(print-elements-recursively animals)

print-elements-recursively 的模式为: