递归模式:keep(筛选保留)

第三种递归模式称为 keep(筛选保留)模式。在该模式中,会对列表的每个元素进行测试;仅当元素满足判定条件时,才对其执行操作并保留结果。

该模式同样与 every 模式类似,区别在于不满足条件的元素会被直接跳过。

该模式分为三部分:

下面是一个使用 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;你也可以将这些模式进行组合使用。