Is there a better way to swap two elements of a list?
This is how i'm doing it, but it seems overly complicated.
(defun swap-elements ( the-list a b)
(rotatef (car (member a the-list))
(car (member b the-list))))
From: Edi Weitz
Subject: Re: swapping two elements of a list
Date:
Message-ID: <ud5vvsnpz.fsf@agharta.de>
On Mon, 24 Jan 2005 00:40:43 +0100, Jim Newton <·····@rdrop.com> wrote:
> Is there a better way to swap two elements of a list? This is how
> i'm doing it, but it seems overly complicated.
>
> (defun swap-elements ( the-list a b)
> (rotatef (car (member a the-list))
> (car (member b the-list))))
I don't think it's complicated. The only problem I see is that it
traverses THE-LIST twice which you might want to avoid for very long
lists. In that case I'd do it like this (untested):
(defun swap (list a b &key (test #'eql))
(let* ((part-1 (member-if (lambda (x)
(or (funcall test x a)
(funcall test x b)))
list))
(other (cond ((funcall test (car part-1) a) b)
(t a)))
(part-2 (member other part-1 :test test)))
(when part-2
(rotatef (car part-1) (car part-2)))))
Cheers,
Edi.
--
Lisp is not dead, it just smells funny.
Real email: (replace (subseq ·········@agharta.de" 5) "edi")