Существует множество способов отфильтровать или выбрать материал из списка, используя встроенные модули, которые намного быстрее, чем циклы. Таким образом можно использовать встроенный метод remove-if. Например, предположим, что я хочу удалить элементы с 3 по 10 в список MyList. Выполните следующий код в качестве примера:
(let ((MyList (number-sequence 0 9))
(Index -1)
)
(remove-if #'(lambda (Elt)
(setq Index (1+ Index))
(and (>= Index 3) (<= Index 5))
)
MyList
)
)
Вы получите '(0 1 2 6 7 8 9).
Предположим, вы хотите оставить только элементы от 3 до 5. Вы в основном переворачиваете условие, которое я написал выше в предикате.
(let ((MyList (number-sequence 0 9))
(Index -1)
)
(remove-if #'(lambda (Elt)
(setq Index (1+ Index))
(or (< Index 3) (> Index 5))
)
MyList
)
)
Вы получите '(3 4 5)
Вы можете использовать все, что вам нужно, для предиката, который вы должны предоставить для remove-if. Единственным ограничением является ваше воображение о том, что использовать. Вы можете использовать функции фильтрации последовательностей, но они вам не нужны.
В качестве альтернативы, вы также можете использовать mapcar или mapcar * для циклического перемещения по списку, используя некоторую функцию, которая превращает определенные записи в nil, и использование (remove-if nil ...) для удаления nils.