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 21:42:07 +0200 Organization: A noiseless patient Spider Lines: 19 Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Injection-Date: Fri, 21 Jun 2024 21:42:11 +0200 (CEST) Injection-Info: jmertens.eternal-september.org; posting-host="5fec433df73c4bbd0209172575181d3d"; logging-data="3492038"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19TGFzb8pGl4loiPHq9Tp+08pby065h2ww=" User-Agent: tin/2.6.2-20221225 ("Pittyvaich") (OpenBSD/7.5 (amd64)) tinews.pl/1.1.61 Cancel-Lock: sha1:oe/GSlD+f1Hi2F1TjZQvMrYHr+E= Bytes: 1891 Joerg Mertens wrote: > (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)) This is clearer: (defun uniquify-sorted-list (list &key (key #'identity) (test #'eql)) (loop for element in list for element-key = (funcall key element) and last-element-key = nil then element-key for result = nil then (funcall test element-key last-element-key) unless result collect element)) I forgot that the loop way to step two clauses in parallel is to combine them with an `and´.