Usando guión:
(defun find-duplicates (list)
"Return a list that contains each element from LIST that occurs more than once."
(--> list
(-group-by #'identity it)
(-filter (lambda (ele) (> (length ele) 2)) it)
(mapcar #'car it)))
Un conjunto de pruebas rápidas:
(ert-deftest nothing ()
(should-not (find-duplicates '())))
(ert-deftest no-duplicates ()
(should-not (find-duplicates '(1 2 3 4 5 6 7 "eight"))))
(ert-deftest single-duplicate ()
(should (equal (find-duplicates '(1 2 3 4 1))
'(1))))
(ert-deftest multiple-duplicates ()
(should (equal (sort (find-duplicates '(1 2 3 4 1 6 7 8 9 2))
#'<)
'(1 2))))
(ert-deftest string-duplicates ()
(should (equal (find-duplicates '(1 2 "three" 4 "three"))
'("three"))))
Actualmente parece devolver los elementos en el orden de la primera aparición de cada duplicado, pero no veo nada en -group-by
eso que lo garantice, así que no creo que se pueda confiar en eso. Posiblemente podría ser más eficiente, usando tablas hash, pero esto funciona.