comparison lisp/subr.el @ 45740:4e576724db9f

(copy-list): Moved to cl.el. (copy-tree): Don't use copy-list or cl-pop.
author Richard M. Stallman <rms@gnu.org>
date Mon, 10 Jun 2002 09:01:08 +0000
parents 9d351e5869c8
children 41129d3d126b
comparison
equal deleted inserted replaced
45739:af30a5644ebc 45740:4e576724db9f
189 The comparison is done with `eq'." 189 The comparison is done with `eq'."
190 (if (memq elt list) 190 (if (memq elt list)
191 (delq elt (copy-sequence list)) 191 (delq elt (copy-sequence list))
192 list)) 192 list))
193 193
194 (defun copy-list (list)
195 "Return a copy of a list, which may be a dotted list.
196 The elements of the list are not copied, just the list structure itself."
197 (if (consp list)
198 (let ((res nil))
199 (while (consp list) (push (pop list) res))
200 (prog1 (nreverse res) (setcdr res list)))
201 (car list)))
202
203 (defun copy-tree (tree &optional vecp) 194 (defun copy-tree (tree &optional vecp)
204 "Make a copy of TREE. 195 "Make a copy of TREE.
205 If TREE is a cons cell, this recursively copies both its car and its cdr. 196 If TREE is a cons cell, this recursively copies both its car and its cdr.
206 Contrast to copy-sequence, which copies only along the cdrs. With second 197 Contrast to `copy-sequence', which copies only along the cdrs. With second
207 argument VECP, this copies vectors as well as conses." 198 argument VECP, this copies vectors as well as conses."
208 (if (consp tree) 199 (if (consp tree)
209 (let ((p (setq tree (copy-list tree)))) 200 (let (result)
210 (while (consp p) 201 (while (consp tree)
211 (if (or (consp (car p)) (and vecp (vectorp (car p)))) 202 (let ((newcar (car tree)))
212 (setcar p (copy-tree (car p) vecp))) 203 (if (or (consp (car tree)) (and vecp (vectorp (car tree))))
213 (or (listp (cdr p)) (setcdr p (copy-tree (cdr p) vecp))) 204 (setq newcar (copy-tree (car tree) vecp)))
214 (cl-pop p))) 205 (push newcar result))
206 (setq tree (cdr tree)))
207 (nreconc result tree))
215 (if (and vecp (vectorp tree)) 208 (if (and vecp (vectorp tree))
216 (let ((i (length (setq tree (copy-sequence tree))))) 209 (let ((i (length (setq tree (copy-sequence tree)))))
217 (while (>= (setq i (1- i)) 0) 210 (while (>= (setq i (1- i)) 0)
218 (aset tree i (copy-tree (aref tree i) vecp)))))) 211 (aset tree i (copy-tree (aref tree i) vecp)))
219 tree) 212 tree)
213 tree)))
220 214
221 (defun assoc-default (key alist &optional test default) 215 (defun assoc-default (key alist &optional test default)
222 "Find object KEY in a pseudo-alist ALIST. 216 "Find object KEY in a pseudo-alist ALIST.
223 ALIST is a list of conses or objects. Each element (or the element's car, 217 ALIST is a list of conses or objects. Each element (or the element's car,
224 if it is a cons) is compared with KEY by evaluating (TEST (car elt) KEY). 218 if it is a cons) is compared with KEY by evaluating (TEST (car elt) KEY).