return сообщает функции count-list о немедленном выходе, как только она обнаружит попадание, поэтому она не будет искать другие элементы, соответствующие количеству. Одно из возможных решений заключается в следующем:
(defun count-list (lst n)
(remove-duplicates
(mapcan #'(lambda (x)
(when (eql (count x lst) n)
(list x) ))
lst )))
Однако это очень неэффективно, поскольку для каждого элемента список необходимо пересматривать дважды, один для самой функции и один для счетчика, так что это займет время, пропорциональное до квадрата длины списка.
Более эффективным способом было бы накапливать значения (например, в ассо c списке) и выбирать в конце те элементы, которые соответствуют числу входных счетчиков.
(defun count-list (lst n)
(let* (count-list pair)
(dolist (x lst)
(if (setq pair (assoc x count-list))
(incf (cdr pair))
(push (cons x 1) count-list) ))
(mapcan #'(lambda (pair)
(when (eql n (cdr pair))
(list (car pair)) ))
count-list )))