don't require grep in vc-git
[bpt/emacs.git] / lisp / emacs-lisp / cl.el
1 ;;; cl.el --- Compatibility aliases for the old CL library. -*- lexical-binding: t -*-
2
3 ;; Copyright (C) 2012-2014 Free Software Foundation, Inc.
4
5 ;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
6 ;; Keywords: extensions
7
8 ;; This file is part of GNU Emacs.
9
10 ;; GNU Emacs is free software: you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation, either version 3 of the License, or
13 ;; (at your option) any later version.
14
15 ;; GNU Emacs is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details.
19
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
22
23 ;;; Commentary:
24
25 ;; This is a compatibility file which provides the old names provided by CL
26 ;; before we cleaned up its namespace usage.
27
28 ;;; Code:
29
30 (require 'cl-lib)
31 (require 'macroexp)
32 (require 'gv)
33
34 ;; (defun cl--rename ()
35 ;; (let ((vdefs ())
36 ;; (fdefs ())
37 ;; (case-fold-search nil)
38 ;; (files '("cl.el" "cl-macs.el" "cl-seq.el" "cl-extra.el")))
39 ;; (dolist (file files)
40 ;; (with-current-buffer (find-file-noselect file)
41 ;; (goto-char (point-min))
42 ;; (while (re-search-forward
43 ;; "^(\\(def[^ \t\n]*\\) +'?\\(\\(\\sw\\|\\s_\\)+\\)" nil t)
44 ;; (let ((name (match-string-no-properties 2))
45 ;; (type (match-string-no-properties 1)))
46 ;; (unless (string-match-p "\\`cl-" name)
47 ;; (cond
48 ;; ((member type '("defvar" "defconst"))
49 ;; (unless (member name vdefs) (push name vdefs)))
50 ;; ((member type '("defun" "defsubst" "defalias" "defmacro"))
51 ;; (unless (member name fdefs) (push name fdefs)))
52 ;; ((member type '("def-edebug-spec" "defsetf" "define-setf-method"
53 ;; "define-compiler-macro"))
54 ;; nil)
55 ;; (t (error "Unknown type %S" type))))))))
56 ;; (let ((re (concat "\\_<" (regexp-opt (append vdefs fdefs)) "\\_>"))
57 ;; (conflicts ()))
58 ;; (dolist (file files)
59 ;; (with-current-buffer (find-file-noselect file)
60 ;; (goto-char (point-min))
61 ;; (while (re-search-forward re nil t)
62 ;; (replace-match "cl-\\&"))
63 ;; (save-buffer))))
64 ;; (with-current-buffer (find-file-noselect "cl-rename.el")
65 ;; (dolist (def vdefs)
66 ;; (insert (format "(defvaralias '%s 'cl-%s)\n" def def)))
67 ;; (dolist (def fdefs)
68 ;; (insert (format "(defalias '%s 'cl-%s)\n" def def)))
69 ;; (save-buffer))))
70
71 ;; (defun cl--unrename ()
72 ;; ;; Taken from "Naming Conventions" node of the doc.
73 ;; (let* ((names '(defun* defsubst* defmacro* function* member*
74 ;; assoc* rassoc* get* remove* delete*
75 ;; mapcar* sort* floor* ceiling* truncate*
76 ;; round* mod* rem* random*))
77 ;; (files '("cl.el" "cl-lib.el" "cl-macs.el" "cl-seq.el" "cl-extra.el"))
78 ;; (re (concat "\\_<cl-" (regexp-opt (mapcar #'symbol-name names))
79 ;; "\\_>")))
80 ;; (dolist (file files)
81 ;; (with-current-buffer (find-file-noselect file)
82 ;; (goto-char (point-min))
83 ;; (while (re-search-forward re nil t)
84 ;; (delete-region (1- (point)) (point)))
85 ;; (save-buffer)))))
86
87 (defun cl-unload-function ()
88 "Stop unloading of the Common Lisp extensions."
89 (message "Cannot unload the feature `cl'")
90 ;; Stop standard unloading!
91 t)
92
93 ;;; Aliases to cl-lib's features.
94
95 (dolist (var '(
96 ;; loop-result-var
97 ;; loop-result
98 ;; loop-initially
99 ;; loop-finally
100 ;; loop-bindings
101 ;; loop-args
102 ;; bind-inits
103 ;; bind-block
104 ;; lambda-list-keywords
105 float-negative-epsilon
106 float-epsilon
107 least-negative-normalized-float
108 least-positive-normalized-float
109 least-negative-float
110 least-positive-float
111 most-negative-float
112 most-positive-float
113 ;; custom-print-functions
114 ))
115 (defvaralias var (intern (format "cl-%s" var))))
116
117 (dolist (fun '(
118 (get* . cl-get)
119 (random* . cl-random)
120 (rem* . cl-rem)
121 (mod* . cl-mod)
122 (round* . cl-round)
123 (truncate* . cl-truncate)
124 (ceiling* . cl-ceiling)
125 (floor* . cl-floor)
126 (rassoc* . cl-rassoc)
127 (assoc* . cl-assoc)
128 (member* . cl-member)
129 (delete* . cl-delete)
130 (remove* . cl-remove)
131 (defsubst* . cl-defsubst)
132 (sort* . cl-sort)
133 (function* . cl-function)
134 (defmacro* . cl-defmacro)
135 (defun* . cl-defun)
136 (mapcar* . cl-mapcar)
137
138 remprop
139 getf
140 tailp
141 list-length
142 nreconc
143 revappend
144 concatenate
145 subseq
146 random-state-p
147 make-random-state
148 signum
149 isqrt
150 lcm
151 gcd
152 notevery
153 notany
154 every
155 some
156 mapcon
157 mapcan
158 mapl
159 maplist
160 map
161 equalp
162 coerce
163 tree-equal
164 nsublis
165 sublis
166 nsubst-if-not
167 nsubst-if
168 nsubst
169 subst-if-not
170 subst-if
171 subsetp
172 nset-exclusive-or
173 set-exclusive-or
174 nset-difference
175 set-difference
176 nintersection
177 intersection
178 nunion
179 union
180 rassoc-if-not
181 rassoc-if
182 assoc-if-not
183 assoc-if
184 member-if-not
185 member-if
186 merge
187 stable-sort
188 search
189 mismatch
190 count-if-not
191 count-if
192 count
193 position-if-not
194 position-if
195 position
196 find-if-not
197 find-if
198 find
199 nsubstitute-if-not
200 nsubstitute-if
201 nsubstitute
202 substitute-if-not
203 substitute-if
204 substitute
205 delete-duplicates
206 remove-duplicates
207 delete-if-not
208 delete-if
209 remove-if-not
210 remove-if
211 replace
212 fill
213 reduce
214 compiler-macroexpand
215 define-compiler-macro
216 assert
217 check-type
218 typep
219 deftype
220 defstruct
221 callf2
222 callf
223 letf*
224 letf
225 rotatef
226 shiftf
227 remf
228 psetf
229 (define-setf-method . define-setf-expander)
230 the
231 locally
232 multiple-value-setq
233 multiple-value-bind
234 symbol-macrolet
235 macrolet
236 progv
237 psetq
238 do-all-symbols
239 do-symbols
240 do*
241 do
242 loop
243 return-from
244 return
245 block
246 etypecase
247 typecase
248 ecase
249 case
250 load-time-value
251 destructuring-bind
252 gentemp
253 gensym
254 pairlis
255 acons
256 subst
257 adjoin
258 copy-list
259 ldiff
260 list*
261 cddddr
262 cdddar
263 cddadr
264 cddaar
265 cdaddr
266 cdadar
267 cdaadr
268 cdaaar
269 cadddr
270 caddar
271 cadadr
272 cadaar
273 caaddr
274 caadar
275 caaadr
276 caaaar
277 cdddr
278 cddar
279 cdadr
280 cdaar
281 caddr
282 cadar
283 caadr
284 caaar
285 tenth
286 ninth
287 eighth
288 seventh
289 sixth
290 fifth
291 fourth
292 third
293 endp
294 rest
295 second
296 first
297 svref
298 copy-seq
299 evenp
300 oddp
301 minusp
302 plusp
303 floatp-safe
304 declaim
305 proclaim
306 nth-value
307 multiple-value-call
308 multiple-value-apply
309 multiple-value-list
310 values-list
311 values
312 pushnew
313 decf
314 incf
315 ))
316 (let ((new (if (consp fun) (prog1 (cdr fun) (setq fun (car fun)))
317 (intern (format "cl-%s" fun)))))
318 (defalias fun new)))
319
320 (defun cl--wrap-in-nil-block (fun &rest args)
321 `(cl-block nil ,(apply fun args)))
322 (advice-add 'dolist :around #'cl--wrap-in-nil-block)
323 (advice-add 'dotimes :around #'cl--wrap-in-nil-block)
324
325 (defun cl--pass-args-to-cl-declare (&rest specs)
326 (macroexpand `(cl-declare ,@specs)))
327 (advice-add 'declare :after #'cl--pass-args-to-cl-declare)
328
329 ;;; Features provided a bit differently in Elisp.
330
331 ;; First, the old lexical-let is now better served by `lexical-binding', tho
332 ;; it's not 100% compatible.
333
334 (defvar cl-closure-vars nil)
335 (defvar cl--function-convert-cache nil)
336
337 (defun cl--function-convert (f)
338 "Special macro-expander for special cases of (function F).
339 The two cases that are handled are:
340 - closure-conversion of lambda expressions for `lexical-let'.
341 - renaming of F when it's a function defined via `cl-labels' or `labels'."
342 (require 'cl-macs)
343 (declare-function cl--expr-contains-any "cl-macs" (x y))
344 (cond
345 ;; ¡¡Big Ugly Hack!! We can't use a compiler-macro because those are checked
346 ;; *after* handling `function', but we want to stop macroexpansion from
347 ;; being applied infinitely, so we use a cache to return the exact `form'
348 ;; being expanded even though we don't receive it.
349 ((eq f (car cl--function-convert-cache)) (cdr cl--function-convert-cache))
350 ((eq (car-safe f) 'lambda)
351 (let ((body (mapcar (lambda (f)
352 (macroexpand-all f macroexpand-all-environment))
353 (cddr f))))
354 (if (and cl-closure-vars
355 (cl--expr-contains-any body cl-closure-vars))
356 (let* ((new (mapcar 'cl-gensym cl-closure-vars))
357 (sub (cl-pairlis cl-closure-vars new)) (decls nil))
358 (while (or (stringp (car body))
359 (eq (car-safe (car body)) 'interactive))
360 (push (list 'quote (pop body)) decls))
361 (put (car (last cl-closure-vars)) 'used t)
362 `(list 'lambda '(&rest --cl-rest--)
363 ,@(cl-sublis sub (nreverse decls))
364 (list 'apply
365 (list 'quote
366 #'(lambda ,(append new (cadr f))
367 ,@(cl-sublis sub body)))
368 ,@(nconc (mapcar (lambda (x) `(list 'quote ,x))
369 cl-closure-vars)
370 '((quote --cl-rest--))))))
371 (let* ((newf `(lambda ,(cadr f) ,@body))
372 (res `(function ,newf)))
373 (setq cl--function-convert-cache (cons newf res))
374 res))))
375 (t
376 (let ((found (assq f macroexpand-all-environment)))
377 (if (and found (ignore-errors
378 (eq (cadr (cl-caddr found)) 'cl-labels-args)))
379 (cadr (cl-caddr (cl-cadddr found)))
380 (let ((res `(function ,f)))
381 (setq cl--function-convert-cache (cons f res))
382 res))))))
383
384 (defmacro lexical-let (bindings &rest body)
385 "Like `let', but lexically scoped.
386 The main visible difference is that lambdas inside BODY will create
387 lexical closures as in Common Lisp.
388 \n(fn BINDINGS BODY)"
389 (declare (indent 1) (debug let))
390 (let* ((cl-closure-vars cl-closure-vars)
391 (vars (mapcar (function
392 (lambda (x)
393 (or (consp x) (setq x (list x)))
394 (push (make-symbol (format "--cl-%s--" (car x)))
395 cl-closure-vars)
396 (set (car cl-closure-vars) [bad-lexical-ref])
397 (list (car x) (cadr x) (car cl-closure-vars))))
398 bindings))
399 (ebody
400 (macroexpand-all
401 `(cl-symbol-macrolet
402 ,(mapcar (lambda (x)
403 `(,(car x) (symbol-value ,(cl-caddr x))))
404 vars)
405 ,@body)
406 (cons (cons 'function #'cl--function-convert)
407 macroexpand-all-environment))))
408 (if (not (get (car (last cl-closure-vars)) 'used))
409 ;; Turn (let ((foo (cl-gensym)))
410 ;; (set foo <val>) ...(symbol-value foo)...)
411 ;; into (let ((foo <val>)) ...(symbol-value 'foo)...).
412 ;; This is good because it's more efficient but it only works with
413 ;; dynamic scoping, since with lexical scoping we'd need
414 ;; (let ((foo <val>)) ...foo...).
415 `(progn
416 ,@(mapcar (lambda (x) `(defvar ,(cl-caddr x))) vars)
417 (let ,(mapcar (lambda (x) (list (cl-caddr x) (cadr x))) vars)
418 ,(cl-sublis (mapcar (lambda (x)
419 (cons (cl-caddr x)
420 `',(cl-caddr x)))
421 vars)
422 ebody)))
423 `(let ,(mapcar (lambda (x)
424 (list (cl-caddr x)
425 `(make-symbol ,(format "--%s--" (car x)))))
426 vars)
427 (setf ,@(apply #'append
428 (mapcar (lambda (x)
429 (list `(symbol-value ,(cl-caddr x)) (cadr x)))
430 vars)))
431 ,ebody))))
432
433 (defmacro lexical-let* (bindings &rest body)
434 "Like `let*', but lexically scoped.
435 The main visible difference is that lambdas inside BODY, and in
436 successive bindings within BINDINGS, will create lexical closures
437 as in Common Lisp. This is similar to the behavior of `let*' in
438 Common Lisp.
439 \n(fn BINDINGS BODY)"
440 (declare (indent 1) (debug let))
441 (if (null bindings) (cons 'progn body)
442 (setq bindings (reverse bindings))
443 (while bindings
444 (setq body (list `(lexical-let (,(pop bindings)) ,@body))))
445 (car body)))
446
447 ;; This should really have some way to shadow 'byte-compile properties, etc.
448 (defmacro flet (bindings &rest body)
449 "Make temporary overriding function definitions.
450 This is an analogue of a dynamically scoped `let' that operates on the function
451 cell of FUNCs rather than their value cell.
452 If you want the Common-Lisp style of `flet', you should use `cl-flet'.
453 The FORMs are evaluated with the specified function definitions in place,
454 then the definitions are undone (the FUNCs go back to their previous
455 definitions, or lack thereof).
456
457 \(fn ((FUNC ARGLIST BODY...) ...) FORM...)"
458 (declare (indent 1) (debug cl-flet)
459 (obsolete "use either `cl-flet' or `cl-letf'." "24.3"))
460 `(letf ,(mapcar
461 (lambda (x)
462 (if (or (and (fboundp (car x))
463 (eq (car-safe (symbol-function (car x))) 'macro))
464 (cdr (assq (car x) macroexpand-all-environment)))
465 (error "Use `labels', not `flet', to rebind macro names"))
466 (let ((func `(cl-function
467 (lambda ,(cadr x)
468 (cl-block ,(car x) ,@(cddr x))))))
469 (when (cl--compiling-file)
470 ;; Bug#411. It would be nice to fix this.
471 (and (get (car x) 'byte-compile)
472 (error "Byte-compiling a redefinition of `%s' \
473 will not work - use `labels' instead" (symbol-name (car x))))
474 ;; FIXME This affects the rest of the file, when it
475 ;; should be restricted to the flet body.
476 (and (boundp 'byte-compile-function-environment)
477 (push (cons (car x) (eval func))
478 byte-compile-function-environment)))
479 (list `(symbol-function ',(car x)) func)))
480 bindings)
481 ,@body))
482
483 ;; Generalized variables are provided by gv.el, but some details are
484 ;; not 100% compatible: not worth the trouble to add them to cl-lib.el, but we
485 ;; still need to support old users of cl.el.
486
487 (defun cl--gv-adapt (cl-gv do)
488 ;; This function is used by all .elc files that use define-setf-expander and
489 ;; were compiled with Emacs>=24.3.
490 (let ((vars (nth 0 cl-gv))
491 (vals (nth 1 cl-gv))
492 (binds ())
493 (substs ()))
494 ;; Use cl-sublis as was done in cl-setf-do-modify.
495 (while vars
496 (if (macroexp-copyable-p (car vals))
497 (push (cons (pop vars) (pop vals)) substs)
498 (push (list (pop vars) (pop vals)) binds)))
499 (macroexp-let*
500 binds
501 (funcall do (cl-sublis substs (nth 4 cl-gv))
502 ;; We'd like to do something like
503 ;; (lambda ,(nth 2 cl-gv) ,(nth 3 cl-gv)).
504 (lambda (exp)
505 (macroexp-let2 macroexp-copyable-p v exp
506 (cl-sublis (cons (cons (car (nth 2 cl-gv)) v)
507 substs)
508 (nth 3 cl-gv))))))))
509
510 (defmacro define-setf-expander (name arglist &rest body)
511 "Define a `setf' method.
512 This method shows how to handle `setf's to places of the form
513 \(NAME ARGS...). The argument forms ARGS are bound according to
514 ARGLIST, as if NAME were going to be expanded as a macro, then
515 the BODY forms are executed and must return a list of five elements:
516 a temporary-variables list, a value-forms list, a store-variables list
517 \(of length one), a store-form, and an access- form.
518
519 See `gv-define-expander', and `gv-define-setter' for better and
520 simpler ways to define setf-methods."
521 (declare (debug
522 (&define name cl-lambda-list cl-declarations-or-string def-body)))
523 `(progn
524 ,@(if (stringp (car body))
525 (list `(put ',name 'setf-documentation ,(pop body))))
526 (gv-define-expander ,name
527 (cl-function
528 (lambda (do ,@arglist)
529 (cl--gv-adapt (progn ,@body) do))))))
530
531 (defmacro defsetf (name arg1 &rest args)
532 "Define a `setf' method.
533 This macro is an easy-to-use substitute for `define-setf-expander'
534 that works well for simple place forms.
535
536 In the simple `defsetf' form, `setf's of the form (setf (NAME
537 ARGS...) VAL) are transformed to function or macro calls of the
538 form (FUNC ARGS... VAL). For example:
539
540 (defsetf aref aset)
541
542 You can replace this form with `gv-define-simple-setter'.
543
544 Alternate form: (defsetf NAME ARGLIST (STORE) BODY...).
545
546 Here, the above `setf' call is expanded by binding the argument
547 forms ARGS according to ARGLIST, binding the value form VAL to
548 STORE, then executing BODY, which must return a Lisp form that
549 does the necessary `setf' operation. Actually, ARGLIST and STORE
550 may be bound to temporary variables which are introduced
551 automatically to preserve proper execution order of the arguments.
552 For example:
553
554 (defsetf nth (n x) (v) `(setcar (nthcdr ,n ,x) ,v))
555
556 You can replace this form with `gv-define-setter'.
557
558 \(fn NAME [FUNC | ARGLIST (STORE) BODY...])"
559 (declare (debug
560 (&define name
561 [&or [symbolp &optional stringp]
562 [cl-lambda-list (symbolp)]]
563 cl-declarations-or-string def-body)))
564 (if (and (listp arg1) (consp args))
565 ;; Like `gv-define-setter' but with `cl-function'.
566 `(gv-define-expander ,name
567 (lambda (do &rest args)
568 (gv--defsetter ',name
569 (cl-function
570 (lambda (,@(car args) ,@arg1) ,@(cdr args)))
571 do args)))
572 `(gv-define-simple-setter ,name ,arg1 ,(car args))))
573
574 ;; FIXME: CL used to provide a setf method for `apply', but I haven't been able
575 ;; to find a case where it worked. The code below tries to handle it as well.
576 ;; (defun cl--setf-apply (form last-witness last)
577 ;; (cond
578 ;; ((not (consp form)) form)
579 ;; ((eq (ignore-errors (car (last form))) last-witness)
580 ;; `(apply #',(car form) ,@(butlast (cdr form)) ,last))
581 ;; ((and (memq (car form) '(let let*))
582 ;; (rassoc (list last-witness) (cadr form)))
583 ;; (let ((rebind (rassoc (list last-witness) (cadr form))))
584 ;; `(,(car form) ,(remq rebind (cadr form))
585 ;; ,@(mapcar (lambda (form) (cl--setf-apply form (car rebind) last))
586 ;; (cddr form)))))
587 ;; (t (mapcar (lambda (form) (cl--setf-apply form last-witness last)) form))))
588 ;; (gv-define-setter apply (val fun &rest args)
589 ;; (pcase fun (`#',(and (pred symbolp) f) (setq fun f))
590 ;; (_ (error "First arg to apply in setf is not #'SYM: %S" fun)))
591 ;; (let* ((butlast (butlast args))
592 ;; (last (car (last args)))
593 ;; (last-witness (make-symbol "--cl-tailarg--"))
594 ;; (setter (macroexpand `(setf (,fun ,@butlast ,last-witness) ,val)
595 ;; macroexpand-all-environment)))
596 ;; (cl--setf-apply setter last-witness last)))
597
598
599 ;; FIXME: CL used to provide get-setf-method, which was used by some
600 ;; setf-expanders, but now that we use gv.el, it is a lot more difficult
601 ;; and in general impossible to provide get-setf-method. Hopefully, it
602 ;; won't be needed. If needed, we'll have to do something nasty along the
603 ;; lines of
604 ;; (defun get-setf-method (place &optional env)
605 ;; (let* ((witness (list 'cl-gsm))
606 ;; (expansion (gv-letplace (getter setter) place
607 ;; `(,witness ,getter ,(funcall setter witness)))))
608 ;; ...find "let prefix" of expansion, extract getter and setter from
609 ;; ...the rest, and build the 5-tuple))
610 (make-obsolete 'get-setf-method 'gv-letplace "24.3")
611
612 (defmacro define-modify-macro (name arglist func &optional doc)
613 "Define a `setf'-like modify macro.
614 If NAME is called, it combines its PLACE argument with the other
615 arguments from ARGLIST using FUNC. For example:
616
617 (define-modify-macro incf (&optional (n 1)) +)
618
619 You can replace this macro with `gv-letplace'."
620 (declare (debug
621 (&define name cl-lambda-list ;; should exclude &key
622 symbolp &optional stringp)))
623 (if (memq '&key arglist)
624 (error "&key not allowed in define-modify-macro"))
625 (let ((place (make-symbol "--cl-place--")))
626 `(cl-defmacro ,name (,place ,@arglist)
627 ,doc
628 (,(if (memq '&rest arglist) #'cl-list* #'list)
629 #'cl-callf ',func ,place
630 ,@(cl--arglist-args arglist)))))
631
632 ;;; Additional compatibility code.
633 ;; For names that were clean but really aren't needed any more.
634
635 (define-obsolete-function-alias 'cl-macroexpand 'macroexpand "24.3")
636 (define-obsolete-variable-alias 'cl-macro-environment
637 'macroexpand-all-environment "24.3")
638 (define-obsolete-function-alias 'cl-macroexpand-all 'macroexpand-all "24.3")
639
640 ;;; Hash tables.
641 ;; This is just kept for compatibility with code byte-compiled by Emacs-20.
642
643 ;; No idea if this might still be needed.
644 (defun cl-not-hash-table (x &optional y &rest _z)
645 (declare (obsolete nil "24.3"))
646 (signal 'wrong-type-argument (list 'cl-hash-table-p (or y x))))
647
648 (defvar cl-builtin-gethash (symbol-function 'gethash))
649 (make-obsolete-variable 'cl-builtin-gethash nil "24.3")
650 (defvar cl-builtin-remhash (symbol-function 'remhash))
651 (make-obsolete-variable 'cl-builtin-remhash nil "24.3")
652 (defvar cl-builtin-clrhash (symbol-function 'clrhash))
653 (make-obsolete-variable 'cl-builtin-clrhash nil "24.3")
654 (defvar cl-builtin-maphash (symbol-function 'maphash))
655
656 (make-obsolete-variable 'cl-builtin-maphash nil "24.3")
657 (define-obsolete-function-alias 'cl-map-keymap 'map-keymap "24.3")
658 (define-obsolete-function-alias 'cl-copy-tree 'copy-tree "24.3")
659 (define-obsolete-function-alias 'cl-gethash 'gethash "24.3")
660 (define-obsolete-function-alias 'cl-puthash 'puthash "24.3")
661 (define-obsolete-function-alias 'cl-remhash 'remhash "24.3")
662 (define-obsolete-function-alias 'cl-clrhash 'clrhash "24.3")
663 (define-obsolete-function-alias 'cl-maphash 'maphash "24.3")
664 (define-obsolete-function-alias 'cl-make-hash-table 'make-hash-table "24.3")
665 (define-obsolete-function-alias 'cl-hash-table-p 'hash-table-p "24.3")
666 (define-obsolete-function-alias 'cl-hash-table-count 'hash-table-count "24.3")
667
668 (define-obsolete-function-alias 'cl-map-keymap-recursively
669 'cl--map-keymap-recursively "24.3")
670 (define-obsolete-function-alias 'cl-map-intervals 'cl--map-intervals "24.3")
671 (define-obsolete-function-alias 'cl-map-extents 'cl--map-overlays "24.3")
672 (define-obsolete-function-alias 'cl-set-getf 'cl--set-getf "24.3")
673
674 (defun cl-maclisp-member (item list)
675 (declare (obsolete member "24.3"))
676 (while (and list (not (equal item (car list)))) (setq list (cdr list)))
677 list)
678
679 ;; Used in the expansion of the old `defstruct'.
680 (defun cl-struct-setf-expander (x name accessor pred-form pos)
681 (declare (obsolete nil "24.3"))
682 (let* ((temp (make-symbol "--cl-x--")) (store (make-symbol "--cl-store--")))
683 (list (list temp) (list x) (list store)
684 `(progn
685 ,@(and pred-form
686 (list `(or ,(cl-subst temp 'cl-x pred-form)
687 (error ,(format
688 "%s storing a non-%s"
689 accessor name)))))
690 ,(if (eq (car (get name 'cl-struct-type)) 'vector)
691 `(aset ,temp ,pos ,store)
692 `(setcar
693 ,(if (<= pos 5)
694 (let ((xx temp))
695 (while (>= (setq pos (1- pos)) 0)
696 (setq xx `(cdr ,xx)))
697 xx)
698 `(nthcdr ,pos ,temp))
699 ,store)))
700 (list accessor temp))))
701
702 (provide 'cl)
703
704 (run-hooks 'cl-load-hook)
705
706 ;;; cl.el ends here