@ Бен: это не вызов setf, это неправильно, проблема в том, что он не обновляет xs.
т.е.: xst устанавливается в xs с удаленным элементом, но xs не обновляется. Если второй элемент должен быть удален, xst будет иметь первый обратно.
вам нужно будет связать xst с xs и заменить xs в вызове remove на xst. Это тогда удалит все элементы x больше чем. а именно:
(defun biggerElems(x xs)
(let ((xst xs))
(dolist (elem xs)
(when (> x elem)
(setf xst (remove elem xst))))
xst))
Возможно, будет немного быстрее установить xst в (copy-list xs), а затем использовать удаление вместо удаления (удаление разрушительно ... в зависимости от вашей реализации, это может быть быстрее, чем удалить. Так как вы вызываете это несколько время от времени вы можете получить лучшую производительность, копируя список один раз и уничтожая его).
В качестве альтернативы:
(defun bigger-elems (x xs) ; I prefer hyphen separated to camelCase... to each his own
(loop for elem in xs when (<= x elem) collect elem))
Оглядываясь на исходное сообщение, это немного сбивает с толку ... вы говорите, что удаляете все элементы больше x, но ваш код выглядит так, как будто он пытается удалить все элементы x больше чем. Решения, которые я написал, возвращают все элементы больше чем x (то есть: удаляют все элементы x больше чем).