From: Jim Newton
Subject: swapping two elements of a list
Date: 
Message-ID: <35ir34F4mnkv5U1@individual.net>
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")