Mercurial > emacs
comparison lisp/emacs-lisp/cl-macs.el @ 73031:b944195ced34
(member*): Use memql instead of complex code.
Suggested by Miles Bader.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Wed, 20 Sep 2006 23:12:25 +0000 |
parents | 067115a6e738 |
children | 1d4b1a32fd66 bb0e318b7c53 |
comparison
equal
deleted
inserted
replaced
73030:fc21b1eb4271 | 73031:b944195ced34 |
---|---|
2576 (define-compiler-macro member* (&whole form a list &rest keys) | 2576 (define-compiler-macro member* (&whole form a list &rest keys) |
2577 (let ((test (and (= (length keys) 2) (eq (car keys) :test) | 2577 (let ((test (and (= (length keys) 2) (eq (car keys) :test) |
2578 (cl-const-expr-val (nth 1 keys))))) | 2578 (cl-const-expr-val (nth 1 keys))))) |
2579 (cond ((eq test 'eq) (list 'memq a list)) | 2579 (cond ((eq test 'eq) (list 'memq a list)) |
2580 ((eq test 'equal) (list 'member a list)) | 2580 ((eq test 'equal) (list 'member a list)) |
2581 ((or (null keys) (eq test 'eql)) | 2581 ((or (null keys) (eq test 'eql)) (list 'memql a list)) |
2582 (if (eq (cl-const-expr-p a) t) | |
2583 (list (if (floatp-safe (cl-const-expr-val a)) 'member 'memq) | |
2584 a list) | |
2585 (if (eq (cl-const-expr-p list) t) | |
2586 (let ((p (cl-const-expr-val list)) (mb nil) (mq nil)) | |
2587 (if (not (cdr p)) | |
2588 (and p (list 'eql a (list 'quote (car p)))) | |
2589 (while p | |
2590 (if (floatp-safe (car p)) (setq mb t) | |
2591 (or (integerp (car p)) (symbolp (car p)) (setq mq t))) | |
2592 (setq p (cdr p))) | |
2593 (if (not mb) (list 'memq a list) | |
2594 (if (not mq) (list 'member a list) form)))) | |
2595 form))) | |
2596 (t form)))) | 2582 (t form)))) |
2597 | 2583 |
2598 (define-compiler-macro assoc* (&whole form a list &rest keys) | 2584 (define-compiler-macro assoc* (&whole form a list &rest keys) |
2599 (let ((test (and (= (length keys) 2) (eq (car keys) :test) | 2585 (let ((test (and (= (length keys) 2) (eq (car keys) :test) |
2600 (cl-const-expr-val (nth 1 keys))))) | 2586 (cl-const-expr-val (nth 1 keys))))) |