monnier pushed a commit to branch master in repository elpa. commit 70b8c353e387b08cc05ca22314f90f4c63333eed Author: Stefan Monnier <monn...@iro.umontreal.ca> Date: Tue Feb 25 09:18:51 2014 -0500
Fixes: debbugs:16671 * cl-lib.el (cl-position, cl-delete-duplicate): Don't advise if >=24.3. (load-path): Try to make sure we're at the end. --- packages/cl-lib/cl-lib.el | 25 ++++++++++++++++++------- 1 files changed, 18 insertions(+), 7 deletions(-) diff --git a/packages/cl-lib/cl-lib.el b/packages/cl-lib/cl-lib.el index 1ea22e0..cf13c56 100644 --- a/packages/cl-lib/cl-lib.el +++ b/packages/cl-lib/cl-lib.el @@ -4,7 +4,7 @@ ;; Author: Stefan Monnier <monn...@iro.umontreal.ca> ;; vcomment: Emacs-24.3's version is 1.0 so this has to stay below. -;; Version: 0.4 +;; Version: 0.5 ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by @@ -36,6 +36,15 @@ ;;; Code: +;; We need to handle the situation where this package is used with an Emacs +;; that comes with a real cl-lib (i.e. ≥24.3). + +;; First line of defense: try to make sure the built-in cl-lib comes earlier in +;; load-path so we never get loaded: +;;;###autoload (let ((d (file-name-directory #$))) +;;;###autoload (when (member d load-path) +;;;###autoload (setq load-path (append (remove d load-path) (list d))))) + (when (functionp 'macroexp--compiler-macro) ;; `macroexp--compiler-macro' was introduced as part of the big CL ;; reorganization which moved/reimplemented some of CL into core (mostly the @@ -318,25 +327,27 @@ (message "%S already defined, not rebinding" new)) (defalias new fun)))) -(autoload 'cl-position "cl-seq") -(defadvice cl-position (around cl-lib (cl-item cl-seq &rest cl-keys) activate) +(unless (symbolp (symbol-function 'position)) + (autoload 'cl-position "cl-seq") + (defadvice cl-position (around cl-lib (cl-item cl-seq &rest cl-keys) activate) (let ((argk (ad-get-args 2))) (if (or (null argk) (keywordp (car argk))) ;; This is a call to cl-lib's `cl-position'. (setq ad-return-value (apply #'position (ad-get-arg 0) (ad-get-arg 1) argk)) ;; Must be a call to cl's old `cl-position'. - ad-do-it))) + ad-do-it)))) -(autoload 'cl-delete-duplicates "cl-seq") -(defadvice cl-delete-duplicates (around cl-lib (cl-seq &rest cl-keys) activate) +(unless (symbolp (symbol-function 'delete-duplicates)) + (autoload 'cl-delete-duplicates "cl-seq") + (defadvice cl-delete-duplicates (around cl-lib (cl-seq &rest cl-keys) activate) (let ((argk (ad-get-args 1))) (if (or (null argk) (keywordp (car argk))) ;; This is a call to cl-lib's `cl-delete-duplicates'. (setq ad-return-value (apply #'delete-duplicates (ad-get-arg 0) argk)) ;; Must be a call to cl's old `cl-delete-duplicates'. - ad-do-it))) + ad-do-it)))) (when (or (not (fboundp 'cl-member)) (eq (symbol-function 'cl-member) #'memq))