在 every 递归模式中,会对列表的每一个元素执行某项操作。
基本模式为:
nil。
cons 将处理后的元素与剩余部分的处理结果组合。
示例如下:
(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 的模式为: