comparison lisp/cl-macs.el @ 5317:8aa511adfad6

#'delete-duplicates: don't attempt to compiler macroexpand with bad arguments 2010-12-29 Aidan Kehoe <kehoea@parhasard.net> * cl-macs.el (delete-duplicates): If the form has an incorrect number of arguments, don't attempt a compiler macroexpansion.
author Aidan Kehoe <kehoea@parhasard.net>
date Wed, 29 Dec 2010 23:56:57 +0000
parents 9ac28212c75a
children 60ba780f9078 6506fcb40fcf
comparison
equal deleted inserted replaced
5316:9ac28212c75a 5317:8aa511adfad6
3485 `(delete-duplicates (the list ,list) :test #'equal :from-end t)) 3485 `(delete-duplicates (the list ,list) :test #'equal :from-end t))
3486 3486
3487 ;; XEmacs; inline delete-duplicates if it's called with one of the 3487 ;; XEmacs; inline delete-duplicates if it's called with one of the
3488 ;; common compile-time constant tests and an optional :from-end 3488 ;; common compile-time constant tests and an optional :from-end
3489 ;; argument, we want the speed in font-lock.el. 3489 ;; argument, we want the speed in font-lock.el.
3490 (define-compiler-macro delete-duplicates (&whole form cl-seq &rest cl-keys) 3490 (define-compiler-macro delete-duplicates (&whole form &rest cl-keys)
3491 (if (not (or (memq (car-safe cl-seq) 3491 (let ((cl-seq (if cl-keys (pop cl-keys))))
3492 ;; No need to check for a list at runtime with 3492 (if (or
3493 ;; these. We could expand the list, but these are all 3493 (not (or (memq (car-safe cl-seq)
3494 ;; the functions in the relevant context at the moment. 3494 ;; No need to check for a list at runtime with
3495 '(nreverse append nconc mapcan mapcar string-to-list)) 3495 ;; these. We could expand the list, but these are all
3496 (and (listp cl-seq) (equal (butlast cl-seq) '(the list))))) 3496 ;; the functions in the relevant context at the moment.
3497 form 3497 '(nreverse append nconc mapcan mapcar string-to-list))
3498 (cond 3498 (and (listp cl-seq) (equal (butlast cl-seq) '(the list)))))
3499 ((or (plists-equal cl-keys '(:test 'eq) t) 3499 ;; Wrong number of arguments.
3500 (plists-equal cl-keys '(:test #'eq) t)) 3500 (not (cdr form)))
3501 `(let* ((begin ,cl-seq) 3501 form
3502 cl-seq) 3502 (cond
3503 (while (memq (car begin) (cdr begin)) 3503 ((or (plists-equal cl-keys '(:test 'eq) t)
3504 (setq begin (cdr begin))) 3504 (plists-equal cl-keys '(:test #'eq) t))
3505 (setq cl-seq begin) 3505 `(let* ((begin ,cl-seq)
3506 (while (cddr cl-seq) 3506 cl-seq)
3507 (if (memq (cadr cl-seq) (cddr cl-seq)) 3507 (while (memq (car begin) (cdr begin))
3508 (setcdr (cdr cl-seq) (cddr cl-seq))) 3508 (setq begin (cdr begin)))
3509 (setq cl-seq (cdr cl-seq))) 3509 (setq cl-seq begin)
3510 begin)) 3510 (while (cddr cl-seq)
3511 ((or (plists-equal cl-keys '(:test 'eq :from-end t) t) 3511 (if (memq (cadr cl-seq) (cddr cl-seq))
3512 (plists-equal cl-keys '(:test #'eq :from-end t) t)) 3512 (setcdr (cdr cl-seq) (cddr cl-seq)))
3513 `(let* ((begin ,cl-seq) 3513 (setq cl-seq (cdr cl-seq)))
3514 (cl-seq begin)) 3514 begin))
3515 (while cl-seq 3515 ((or (plists-equal cl-keys '(:test 'eq :from-end t) t)
3516 (setq cl-seq (setcdr cl-seq 3516 (plists-equal cl-keys '(:test #'eq :from-end t) t))
3517 (delq (car cl-seq) (cdr cl-seq))))) 3517 `(let* ((begin ,cl-seq)
3518 begin)) 3518 (cl-seq begin))
3519 ((or (plists-equal cl-keys '(:test 'equal) t) 3519 (while cl-seq
3520 (plists-equal cl-keys '(:test #'equal) t)) 3520 (setq cl-seq (setcdr cl-seq
3521 `(let* ((begin ,cl-seq) 3521 (delq (car cl-seq) (cdr cl-seq)))))
3522 cl-seq) 3522 begin))
3523 (while (member (car begin) (cdr begin)) 3523 ((or (plists-equal cl-keys '(:test 'equal) t)
3524 (setq begin (cdr begin))) 3524 (plists-equal cl-keys '(:test #'equal) t))
3525 (setq cl-seq begin) 3525 `(let* ((begin ,cl-seq)
3526 (while (cddr cl-seq) 3526 cl-seq)
3527 (if (member (cadr cl-seq) (cddr cl-seq)) 3527 (while (member (car begin) (cdr begin))
3528 (setcdr (cdr cl-seq) (cddr cl-seq))) 3528 (setq begin (cdr begin)))
3529 (setq cl-seq (cdr cl-seq))) 3529 (setq cl-seq begin)
3530 begin)) 3530 (while (cddr cl-seq)
3531 ((or (plists-equal cl-keys '(:test 'equal :from-end t) t) 3531 (if (member (cadr cl-seq) (cddr cl-seq))
3532 (plists-equal cl-keys '(:test #'equal :from-end t) t)) 3532 (setcdr (cdr cl-seq) (cddr cl-seq)))
3533 `(let* ((begin ,cl-seq) 3533 (setq cl-seq (cdr cl-seq)))
3534 (cl-seq begin)) 3534 begin))
3535 (while cl-seq 3535 ((or (plists-equal cl-keys '(:test 'equal :from-end t) t)
3536 (setq cl-seq (setcdr cl-seq (delete (car cl-seq) 3536 (plists-equal cl-keys '(:test #'equal :from-end t) t))
3537 (cdr cl-seq))))) 3537 `(let* ((begin ,cl-seq)
3538 begin)) 3538 (cl-seq begin))
3539 (t form)))) 3539 (while cl-seq
3540 (setq cl-seq (setcdr cl-seq (delete (car cl-seq)
3541 (cdr cl-seq)))))
3542 begin))
3543 (t form)))))
3540 3544
3541 ;; XEmacs; it's perfectly reasonable, and often much clearer to those 3545 ;; XEmacs; it's perfectly reasonable, and often much clearer to those
3542 ;; reading the code, to call regexp-quote on a constant string, which is 3546 ;; reading the code, to call regexp-quote on a constant string, which is
3543 ;; something we can optimise here easily. 3547 ;; something we can optimise here easily.
3544 (define-compiler-macro regexp-quote (&whole form string) 3548 (define-compiler-macro regexp-quote (&whole form string)