Мне пришлось повторно реализовать определенную функцию почти в каждой программе Lisp, которую я когда-либо писал. Поскольку эта функция настолько полезна, она должна была быть реализована ранее. Я ожидаю, что это будет хорошо известно. Возможно, это часть стандартной библиотеки Common Lisp. Как это называется и от какой библиотеки?Стандартное имя для сбора коллекций поддеревьев, удовлетворяющих предикату?
(defun unknown-function (predicate tree)
(loop for item in tree
if (funcall predicate item) collect item
else if (listp item) append (unknown-function predicate item)))
Он спускается по дереву и создает плоский список всех узлов в этом дереве, удовлетворяющих предикату.
Обычно задача, которую вы пытаетесь выполнить, решается путем объединения двух разных функций, которые сглаживают дерево и другие, которые фильтруют элементы из этого списка. В Common Lisp нет примитивной функции flatten (но если вы ее найдете в Google, вы найдете множество определений, например, см. [Эту ссылку] (http://stackoverflow.com/questions/2680864/how-to-remove-nested -parentheses-in-lisp)), тогда как для функции фильтра вы можете использовать remove-if или remove-if-not ([manual] (http://www.lispworks.com/documentation/HyperSpec/Body/f_rm_rm.htm # удалить, если)). – Renzo
'flatten' и' remove-if-not' не могли произвести эту функцию, потому что предикат может выбрать подрешители из дерева, в то время как 'flatten' избавится от всех подписок до того, как предикат получит возможность их увидеть. –