@ Бен: Это не звонок setf, это неправильно - проблема в том, что он не обновляет xs.
ie: 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 в (копирование списка хз), а затем использовать удаление вместо удаления (удалить, разрушительно ... в зависимости от реализации, она может быть быстрее, чем удалить. Поскольку вы вызываете это несколько раз, вы можете получить лучшую производительность, скопировав список один раз и разрушительно удалив из него).
В качестве альтернативы:
(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 больше, чем. Решения, которые я написал, возвращают все элементы, большие, чем х (т. Е. Удаляют все элементы х больше).
Просто потому, что вы можете использовать рекурсию в Lisp, не означает, что это «Lisp Way». Есть несколько механизмов для этого в Lisp (как видно здесь в другом месте), и все они идиоматичны. Рекурсивный метод просто самый примитивный. – 2008-09-22 22:43:05