]> code.delx.au - gnu-emacs-elpa/blobdiff - packages/cl-lib/cl-lib.el
Fixes: debbugs:16671
[gnu-emacs-elpa] / packages / cl-lib / cl-lib.el
index 1ea22e095f4b5dfe505780574480679a88421020..cf13c565e4d93a704536506e00c5d46c7ce46003 100644 (file)
@@ -4,7 +4,7 @@
 
 ;; Author: Stefan Monnier <monnier@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
 
 ;;; 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
           (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))