Path: ...!feed.opticnetworks.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!jmertens.eternal-september.org!.POSTED!not-for-mail From: Joerg Mertens Newsgroups: comp.lang.lisp Subject: Re: Faster remove-duplicates with sorted list. Date: Fri, 21 Jun 2024 12:22:31 +0200 Organization: A noiseless patient Spider Lines: 51 Message-ID: References: Injection-Date: Fri, 21 Jun 2024 12:22:34 +0200 (CEST) Injection-Info: jmertens.eternal-september.org; posting-host="7ae42e8280091382f0aff5976b7e5038"; logging-data="3286872"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19sTVA/U0RlDcrm654E8EiRtXc8CIyQ1kc=" User-Agent: tin/2.6.2-20221225 ("Pittyvaich") (OpenBSD/7.5 (amd64)) tinews.pl/1.1.61 Cancel-Lock: sha1:pYsg3WynJkHQnkXgNhjmEzV3koc= Bytes: 2701 B. Pym wrote: > "Pierre R. Mai" wrote: > >> (defun uniquify-sorted-list (list &key (key #'identity) (test #'eql)) >> (loop for element in list >> for element-key = (funcall key element) >> for last-element-key = (load-time-value (gensym)) >> then element-key >> unless (funcall test element-key last-element-key) >> collect element)) > > Testing under SBCL: > > (defun uniquify-sorted-list (list &key (key #'identity) (test #'eql)) > (loop for element in list > for element-key = (funcall key element) > for last-element-key = (load-time-value (gensym)) > then element-key > unless (funcall test element-key last-element-key) > collect element)) > > (uniquify-sorted-list '(a b b c d d e f f f g)) > ===> > (A) > > (uniquify-sorted-list '(2 2 3 4 4 4 5 5 6 7)) > ===> > (2) > > (uniquify-sorted-list '(2 2 3 4 4 4 5 5 6 7) :test #'=) > ===> > debugger invoked on a SIMPLE-TYPE-ERROR in thread > #: > Argument Y is not a NUMBER: #:G5 (defun uniquify-sorted-list (list &key (key #'identity) (test #'eql)) (loop for element in list for last-element-key = nil then element-key for element-key = (funcall key element) for result = nil then (funcall test element-key last-element-key) unless result collect element)) Tested with GNU Clisp: [3]> (uniquify-sorted-list '(a b b c d d e f f f g)) (A B C D E F G) [4]> (uniquify-sorted-list '(2 2 3 4 4 4 5 5 6 7)) (2 3 4 5 6 7) [5]> (uniquify-sorted-list '(2 2 3 4 4 4 5 5 6 7) :test #'=) (2 3 4 5 6 7)