(defun shrink-alist (alist)
(let (tmp)
(dolist (x alist)
(or (assq (car x) tmp)
(push x tmp)))
(reverse tmp)))
より
(defun shrink-alist (alist)
(and alist
(cons (car alist)
(shrink-alist (remove-if
(lambda (x) (eq (car x) (caar alist)))
(cdr alist))))))
の方が自然に思えたら一歩前進。