Написать функцию,которая сохраняет дубликаты эл-ов списка в список.Пример описан ниже - Lisp
Формулировка задачи:
Решение задачи: «Написать функцию,которая сохраняет дубликаты эл-ов списка в список.Пример описан ниже»
(defun collect-doubles (list &optional (func #'equal)) (let ((table (make-hash-table :test func))) (loop for (a . b) on list if (find a b :test func) do (setf (gethash a table) t)) (loop for e being the hash-keys in table collect e)))
Объяснение кода листинга программы
В данном коде реализована функция collect-doubles, которая сохраняет дубликаты элементов списка в новый список. Функция принимает два аргумента: список и анонимную функцию func. Если func не указана, то по умолчанию используется функция equal.
Внутри функции создается хэш-таблица с помощью make-hash-table, где ключами являются элементы списка, а значением - t.
Затем происходит два цикла. Первый цикл с помощью loop проходит по всем элементам списка. Если элемент a уже присутствует в хэш-таблице (т.е. (find a b :test func) возвращает не nil), то в хэш-таблицу для элемента a присваивается значение t.
Второй цикл с помощью loop проходит по всем ключам хэш-таблицы и собирает их в новый список.
Таким образом, функция collect-doubles возвращает список, содержащий только дубликаты элементов исходного списка.