all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "Drew Adams" <drew.adams@oracle.com>
Subject: RE: best way to get the list of unique keys from 2 alists
Date: Fri, 16 Dec 2005 16:13:29 -0800	[thread overview]
Message-ID: <DNEMKBNJBGPAOPIJOOICKEGFDAAA.drew.adams@oracle.com> (raw)
In-Reply-To: <dnuukf$u1k$1@sea.gmane.org>

    I've got 2 alists of (SYMBOL . "STRING") pairs, and I need to get the
    list of unique symbol names to pass to completing-read as its TABLE
    argument: (("SYMBOL-NAME") ...)

    I know about remove-duplicates and union, but I'd like to avoid using
    cl*.el functions.

    Since completing-read seems to ignore nil entries in TABLE, this is what
    I've got now:

    (nconc (mapcar (lambda (assoc)
                      (list (symbol-name (car assoc))))
                    alist-1)
            (mapcar (lambda (assoc)
                      (or (assq (car assoc) alist-1)
                          (list (symbol-name (car assoc)))))
                    alist-2))

    Is there a cleaner way?

That looks good to me.

You could always define union or remove-duplicates, but removing duplicates
would be less efficient than what you're doing (consing up the second list
completely, just to perhaps remove stuff). Anyway, here are non-destructive
versions of remove-duplicates and union, FWIW:

(defun remove-duplicates (list)
  "Copy of LIST with duplicate elements removed.
Tested with `equal'."
  (let ((tail list)
        new)
    (while tail
      (unless (member (car tail) new)
         (push (car tail) new))
      (pop tail))
    (nreverse new)))

(defun union (list1 list2)
  "Combine LIST1 and LIST2 using a set-union operation.
The result list contains all items that appear in either LIST1 or
LIST2.  This is a non-destructive function; it copies the data if
necessary."
  (cond ((null list1) list2)
        ((null list2) list1)
	((equal list1 list2) list1)
	(t
	 (or (>= (length list1) (length list2))
	     (setq list1 (prog1 list2 (setq list2 list1)))) ; Swap them.
	 (while list2
           (unless (member (car list2) list1)
               (setq list1 (cons (car list2) list1)))
	   (setq list2 (cdr list2)))
	 list1)))

  reply	other threads:[~2005-12-17  0:13 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-12-16 17:47 best way to get the list of unique keys from 2 alists Kevin Rodgers
2005-12-17  0:13 ` Drew Adams [this message]
2005-12-17  0:36 ` Kevin Rodgers
     [not found] <mailman.19635.1134911223.20277.help-gnu-emacs@gnu.org>
2005-12-18 15:20 ` Stefan Monnier
2005-12-19 18:50   ` Kevin Rodgers
     [not found]   ` <mailman.19843.1135018721.20277.help-gnu-emacs@gnu.org>
2005-12-20  3:35     ` Stefan Monnier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DNEMKBNJBGPAOPIJOOICKEGFDAAA.drew.adams@oracle.com \
    --to=drew.adams@oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.