Подход сопоставления
:
;; assuming get-value-if-attrib-present simply returns nil when not present
;; (i.e. your attribute value cannot be nil without ambiguity)
;;
;; get the list of values from the children, matching attrib
;;
(mapcan (lambda (child)
(if (get-value-if-attrib-present child attrib)
(list child)))
children)
mapcan
ожидает, что функция возвратит списки, и она разрушительно их объединяет.Поэтому вы должны быть осторожны, чтобы не возвращать цитируемые списки из лямбды или любые списки, которые пришли откуда-то еще (здесь не рассматривается).
В Парадигмы программирования искусственного интеллекта (он же)PAIP), Питер Норвиг вводит функцию mappend
, которая делает то же самое, но не разрушительно.Это полезно иметь в своем наборе инструментов иногда.