Resposta ao exercício 55

(defun remove-duplicados (lista)
   (cond ((null lista) nil)
         ((member (first lista) (rest lista))
          (remove-duplicados (rest lista)))
         (t (cons (first lista)
                  (remove-duplicados (rest lista))))))

Esta função não mantém a anterior ordenação da lista. Se pretendermos preservar a ordem original, temos de testar se um elemento já existe na lista que estamos a construir e não na que estamos a analisar.

(defun remove-duplicados2 (lista)
  (labels ((remove-aux (lista lista-aux)
            (cond ((null lista) nil)
                  ((member (first lista) lista-aux)
                   (remove-aux (rest lista) lista-aux))
                  (t (cons (first lista)
                           (remove-aux
                              (rest lista)
                              (cons (first lista)
                                     lista-aux)))))))
    (remove-aux lista nil)))

> (remove-duplicados2 '(1 2 3 3 2 4 5 4 1)) (1 2 3 4 5)

Esta função já existe em Lisp e denomina-se remove-duplicates.