第三种递归模式称为 keep(筛选保留)模式。在该模式中,会对列表的每个元素进行测试;仅当元素满足判定条件时,才对其执行操作并保留结果。
该模式同样与 every 模式类似,区别在于不满足条件的元素会被直接跳过。
该模式分为三部分:
nil。
cons 将其与
下面是一个使用 cond 的示例:
The pattern has three parts:
(defun keep-three-letter-words (word-list)
"在 WORD-LIST 中保留由三个字母组成的单词。"
(cond
;; 第一个循环条件:终止条件
((not word-list) nil)
;; 第二个循环条件:执行操作的条件
((eq 3 (length (symbol-name (car word-list))))
;; 将处理后的元素与对更短列表的递归调用结果组合
(cons (car word-list) (keep-three-letter-words (cdr word-list))))
;; 第三个循环条件:跳过元素的条件
;; 对更短列表执行下一步表达式的递归调用
(t (keep-three-letter-words (cdr word-list)))))
(keep-three-letter-words '(one two three four five six))
⇒ (one two six)
不言而喻,终止条件不必使用 nil;你也可以将这些模式进行组合使用。