annotate lisp/emacs-lisp/assoc.el @ 55434:f88632e54afb

2004-05-08 John Wiegley <johnw@newartisans.com> * iswitchb.el (iswitchb-use-virtual-buffers): Added support for "virtual buffers" (off by default), which makes it possible to switch to the buffers of recently files. When a buffer name search fails, and this option is on, iswitchb will look at the list of recently visited files, and permit matching against those names. When the user hits RET on a match, it will revisit that file. (iswitchb-read-buffer): Added two optional arguments, which makes isearchb.el possible. (iswitchb-completions, iswitchb-set-matches, iswitchb-prev-match, iswitchb-next-match): Added support for virtual buffers.
author John Wiegley <johnw@newartisans.com>
date Sat, 08 May 2004 13:00:52 +0000
parents 695cf19ef79e
children 18a818a2ee7c 375f2633d815
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2567
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
1 ;;; assoc.el --- insert/delete/sort functions on association lists
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
2
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
3 ;; Copyright (C) 1996 Free Software Foundation, Inc.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
4
2567
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
5 ;; Author: Barry A. Warsaw <bwarsaw@cen.com>
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
6 ;; Keywords: extensions
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
7
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
8 ;; This file is part of GNU Emacs.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
9
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
11 ;; it under the terms of the GNU General Public License as published by
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
12 ;; the Free Software Foundation; either version 2, or (at your option)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
13 ;; any later version.
2567
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
14
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
15 ;; GNU Emacs is distributed in the hope that it will be useful,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
18 ;; GNU General Public License for more details.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
19
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
20 ;; You should have received a copy of the GNU General Public License
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4098
diff changeset
23 ;; Boston, MA 02111-1307, USA.
2567
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
24
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
25 ;;; Commentary:
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
26
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
27 ;; Association list utilities providing insertion, deletion, sorting
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
28 ;; fetching off key-value pairs in association lists.
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
29
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
30 ;;; Code:
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
31
4098
0a02227f8417 * assoc.el (asort): First argument should be named alist-symbol,
Jim Blandy <jimb@redhat.com>
parents: 3768
diff changeset
32 (defun asort (alist-symbol key)
2567
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
33 "Move a specified key-value pair to the head of an alist.
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
34 The alist is referenced by ALIST-SYMBOL. Key-value pair to move to
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
35 head is one matching KEY. Returns the sorted list and doesn't affect
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
36 the order of any other key-value pair. Side effect sets alist to new
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
37 sorted list."
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
38 (set alist-symbol
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
39 (sort (copy-alist (eval alist-symbol))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
40 (function (lambda (a b) (equal (car a) key))))))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
41
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
42
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
43 (defun aelement (key value)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
44 "Makes a list of a cons cell containing car of KEY and cdr of VALUE.
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
45 The returned list is suitable as an element of an alist."
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
46 (list (cons key value)))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
47
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
48
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
49 (defun aheadsym (alist)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
50 "Return the key symbol at the head of ALIST."
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
51 (car (car alist)))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
52
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
53
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
54 (defun anot-head-p (alist key)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
55 "Find out if a specified key-value pair is not at the head of an alist.
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
56 The alist to check is specified by ALIST and the key-value pair is the
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
57 one matching the supplied KEY. Returns nil if ALIST is nil, or if
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
58 key-value pair is at the head of the alist. Returns t if key-value
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
59 pair is not at the head of alist. ALIST is not altered."
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
60 (not (equal (aheadsym alist) key)))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
61
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
62
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
63 (defun aput (alist-symbol key &optional value)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
64 "Inserts a key-value pair into an alist.
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
65 The alist is referenced by ALIST-SYMBOL. The key-value pair is made
3768
d3fd7bcefd84 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 2567
diff changeset
66 from KEY and optionally, VALUE. Returns the altered alist or nil if
2567
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
67 ALIST is nil.
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
68
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
69 If the key-value pair referenced by KEY can be found in the alist, and
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
70 VALUE is supplied non-nil, then the value of KEY will be set to VALUE.
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
71 If VALUE is not supplied, or is nil, the key-value pair will not be
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
72 modified, but will be moved to the head of the alist. If the key-value
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
73 pair cannot be found in the alist, it will be inserted into the head
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
74 of the alist (with value nil if VALUE is nil or not supplied)."
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
75 (let ((elem (aelement key value))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
76 alist)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
77 (asort alist-symbol key)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
78 (setq alist (eval alist-symbol))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
79 (cond ((null alist) (set alist-symbol elem))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
80 ((anot-head-p alist key) (set alist-symbol (nconc elem alist)))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
81 (value (setcar alist (car elem)))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
82 (t alist))))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
83
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
84
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
85 (defun adelete (alist-symbol key)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
86 "Delete a key-value pair from the alist.
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
87 Alist is referenced by ALIST-SYMBOL and the key-value pair to remove
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
88 is pair matching KEY. Returns the altered alist."
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
89 (asort alist-symbol key)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
90 (let ((alist (eval alist-symbol)))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
91 (cond ((null alist) nil)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
92 ((anot-head-p alist key) alist)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
93 (t (set alist-symbol (cdr alist))))))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
94
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
95
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
96 (defun aget (alist key &optional keynil-p)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
97 "Returns the value in ALIST that is associated with KEY.
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
98 Optional KEYNIL-P describes what to do if the value associated with
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
99 KEY is nil. If KEYNIL-P is not supplied or is nil, and the value is
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
100 nil, then KEY is returned. If KEYNIL-P is non-nil, then nil would be
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
101 returned.
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
102
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
103 If no key-value pair matching KEY could be found in ALIST, or ALIST is
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
104 nil then nil is returned. ALIST is not altered."
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
105 (let ((copy (copy-alist alist)))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
106 (cond ((null alist) nil)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
107 ((progn (asort 'copy key)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
108 (anot-head-p copy key)) nil)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
109 ((cdr (car copy)))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
110 (keynil-p nil)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
111 ((car (car copy)))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
112 (t nil))))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
113
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
114
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
115 (defun amake (alist-symbol keylist &optional valuelist)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
116 "Make an association list.
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
117 The association list is attached to the alist referenced by
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
118 ALIST-SYMBOL. Each element in the KEYLIST becomes a key and is
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
119 associated with the value in VALUELIST with the same index. If
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
120 VALUELIST is not supplied or is nil, then each key in KEYLIST is
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
121 associated with nil.
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
122
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
123 KEYLIST and VALUELIST should have the same number of elements, but
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
124 this isn't enforced. If VALUELIST is smaller than KEYLIST, remaining
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
125 keys are associated with nil. If VALUELIST is larger than KEYLIST,
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
126 extra values are ignored. Returns the created alist."
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
127 (let ((keycar (car keylist))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
128 (keycdr (cdr keylist))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
129 (valcar (car valuelist))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
130 (valcdr (cdr valuelist)))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
131 (cond ((null keycdr)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
132 (aput alist-symbol keycar valcar))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
133 (t
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
134 (amake alist-symbol keycdr valcdr)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
135 (aput alist-symbol keycar valcar))))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
136 (eval alist-symbol))
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
137
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
138 (provide 'assoc)
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
139
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 14169
diff changeset
140 ;;; arch-tag: 3e58bd89-d912-4b74-a0dc-6ed9735922bc
2567
2cd6cb337d7c Initial revision
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
diff changeset
141 ;;; assoc.el ends here