Будучи новым с CL, я много играю с простыми алгоритмами. Например, я попытался реализовать функцию для удаления всех уникальных элементов в списке.В чем основное отличие строк и чисел от Common Lisp?
(1 2 2 3 3 4 5 3) -> (2 2 3 3 3)
Первая попытка привести к этому коду:
(defun remove-unique (items)
(let ((duplicates (set-difference items (remove-duplicates items :test #'equal))))
(append duplicates (remove-duplicates duplicates :test #'equal))))
Это хорошо работает со строками но всегда возвращает NIL
для чисел. Чтение немного больше о set-difference
Я узнал, что не следует работать с дублирующимися заполненными списками вообще, это как-то работает в моем случае, поэтому я отказался от подхода как неспортивного и двинулся вперед.
Другая попытка:
(defun remove-unique (items)
(loop for item in items
when (member item (cdr (member item items)))
collect item))
И это хорошо работает с цифрами, но возвращает NIL
для строк.
По-видимому, существует основное различие между строками и числами, которые я не понимаю. Почему функции обработки списка, такие как member
и set-difference
, работают по-другому?
'member' также принимает предикат, который указывает, какое сравнение вы хотите применить к элементам списка. –
Спасибо! Я действительно забыл об этом. Но это все равно 'NIL' для строк. – akalenuk
Это действительно пропустил 'test', я просто накормил его списком без дубликатов при тестировании во второй раз :-) Неудивительно, что это дало мне ноль. – akalenuk