changeset: 5583:10f179710250
tag: tip
user: Aidan Kehoe <kehoea(a)parhasard.net>
date: Sun Oct 09 12:55:51 2011 +0100
files: lisp/ChangeLog lisp/cl-extra.el lisp/loadup.el lisp/mule/cyrillic.el
lisp/mule/general-late.el lisp/mule/latin.el lisp/obsolete.el lisp/packages.el
man/ChangeLog man/lispref/lists.texi src/ChangeLog src/fns.c src/fontcolor-tty.c
src/lisp.h
description:
Deprecate #'remassoc, #'remassq, #'remrassoc, #'remrassq.
src/ChangeLog addition:
2011-10-09 Aidan Kehoe <kehoea(a)parhasard.net>
* fns.c (remassoc_no_quit):
* fns.c (remrassq_no_quit):
* fns.c (syms_of_fns):
* fontcolor-tty.c (Fregister_tty_color):
* fontcolor-tty.c (Funregister_tty_color):
* fontcolor-tty.c (Ffind_tty_color):
* lisp.h:
Remove Fremassq, Fremrassq, Fremassoc, Fremrassoc, they're
XEmacs-specific functions and Lisp callers should use (delete*
... :key #'car) anyway. Keep the non-Lisp-visible _no_quit
versions, calling FdeleteX from C with the appropriate arguments
is ungainly.
lisp/ChangeLog addition:
2011-10-09 Aidan Kehoe <kehoea(a)parhasard.net>
* obsolete.el:
* obsolete.el (assq-delete-all):
* packages.el (package-provide):
* packages.el (package-suppress):
* mule/cyrillic.el ("Cyrillic-KOI8"):
* mule/cyrillic.el (koi8-u):
* mule/general-late.el (posix-charset-to-coding-system-hash):
* mule/latin.el:
* mule/latin.el (for):
* cl-extra.el:
* cl-extra.el (cl-extra):
* loadup.el (load-history):
Change any uses of #'remassq, #'remassoc and friends to calling
#'delete* with an appropriate key argument. Provide compatibility
implementations, mark them obsolete.
man/ChangeLog addition:
2011-10-09 Aidan Kehoe <kehoea(a)parhasard.net>
* lispref/lists.texi (Association Lists):
Don't document #'remassoc, #'remassq and friends in detail;
they're XEmacs-specific and (delete* ... :key #'car) is
preferable.
diff -r 873d7425c1ad -r 10f179710250 lisp/ChangeLog
--- a/lisp/ChangeLog Sun Oct 09 10:39:09 2011 +0100
+++ b/lisp/ChangeLog Sun Oct 09 12:55:51 2011 +0100
@@ -1,3 +1,21 @@
+2011-10-09 Aidan Kehoe <kehoea(a)parhasard.net>
+
+ * obsolete.el:
+ * obsolete.el (assq-delete-all):
+ * packages.el (package-provide):
+ * packages.el (package-suppress):
+ * mule/cyrillic.el ("Cyrillic-KOI8"):
+ * mule/cyrillic.el (koi8-u):
+ * mule/general-late.el (posix-charset-to-coding-system-hash):
+ * mule/latin.el:
+ * mule/latin.el (for):
+ * cl-extra.el:
+ * cl-extra.el (cl-extra):
+ * loadup.el (load-history):
+ Change any uses of #'remassq, #'remassoc and friends to calling
+ #'delete* with an appropriate key argument. Provide compatibility
+ implementations, mark them obsolete.
+
2011-10-08 Aidan Kehoe <kehoea(a)parhasard.net>
* cl-macs.el:
diff -r 873d7425c1ad -r 10f179710250 lisp/cl-extra.el
--- a/lisp/cl-extra.el Sun Oct 09 10:39:09 2011 +0100
+++ b/lisp/cl-extra.el Sun Oct 09 12:55:51 2011 +0100
@@ -874,6 +874,30 @@
(-1 (1- (length (format "%b" (- integer)))))
(1 (length (format "%b" integer)))))
+;; These are here because labels and symbol-macrolet are not available in
+;; obsolete.el. They are, however, all marked as obsolete in that file.
+(symbol-macrolet ((not-nil '#:not-nil))
+ (labels ((car-or-not-nil (object)
+ (if (consp object) (car object) not-nil))
+ (cdr-or-not-nil (object)
+ (if (consp object) (cdr object) not-nil)))
+ (defalias 'remassoc
+ #'(lambda (key alist)
+ (delete* key alist :test #'equal
+:key (if key #'car-safe #'car-or-not-nil))))
+ (defalias 'remrassoc
+ #'(lambda (key alist)
+ (delete* key alist :test #'equal
+:key (if key #'cdr-safe #'cdr-or-not-nil))))
+ (defalias 'remrassq
+ #'(lambda (key alist)
+ (delete* key alist :test #'eq
+:key (if key #'cdr-safe #'cdr-or-not-nil))))
+ (defalias 'remassq
+ #'(lambda (key alist)
+ (delete* key alist :test #'eq
+:key (if key #'car-safe #'car-or-not-nil))))))
+
(run-hooks 'cl-extra-load-hook)
;; XEmacs addition
diff -r 873d7425c1ad -r 10f179710250 lisp/loadup.el
--- a/lisp/loadup.el Sun Oct 09 10:39:09 2011 +0100
+++ b/lisp/loadup.el Sun Oct 09 12:55:51 2011 +0100
@@ -225,7 +225,7 @@
(delete*
nil
(mapc #'(lambda (element)
- (remassq 'defun element)
+ (delete* 'defun element :key #'car-safe)
(delete-if
#'(lambda (elt)
(and
diff -r 873d7425c1ad -r 10f179710250 lisp/mule/cyrillic.el
--- a/lisp/mule/cyrillic.el Sun Oct 09 10:39:09 2011 +0100
+++ b/lisp/mule/cyrillic.el Sun Oct 09 12:55:51 2011 +0100
@@ -418,7 +418,7 @@
(set-language-info-alist
"Cyrillic-KOI8"
- (remassq 'locale (copy-list (cdr (assoc "Russian" language-info-alist))))
+ (remove* 'locale (cdr (assoc "Russian" language-info-alist)) :key
#'car)
'("Cyrillic"))
;; KOI8-U, for Ukrainian.
diff -r 873d7425c1ad -r 10f179710250 lisp/mule/general-late.el
--- a/lisp/mule/general-late.el Sun Oct 09 10:39:09 2011 +0100
+++ b/lisp/mule/general-late.el Sun Oct 09 12:55:51 2011 +0100
@@ -46,13 +46,13 @@
;; fraction faster for those languages.
language-info-alist
(cons (assoc "Japanese" language-info-alist)
- (remassoc "Japanese" language-info-alist))
+ (delete* "Japanese" language-info-alist :test #'equal :key
#'car))
language-info-alist
(cons (assoc "German" language-info-alist)
- (remassoc "German" language-info-alist))
+ (delete* "German" language-info-alist :test #'equal :key #'car))
language-info-alist
(cons (assoc "English" language-info-alist)
- (remassoc "English" language-info-alist))
+ (delete* "English" language-info-alist :test #'equal :key #'car))
;; Make Installation-string actually reflect the environment at
;; byte-compile time. (We can't necessarily decode it when version.el
diff -r 873d7425c1ad -r 10f179710250 lisp/mule/latin.el
--- a/lisp/mule/latin.el Sun Oct 09 10:39:09 2011 +0100
+++ b/lisp/mule/latin.el Sun Oct 09 12:55:51 2011 +0100
@@ -2056,6 +2056,6 @@
(setcar assocked
(upcase (symbol-name coding-system)))
(setcdr assocked
- (remassq 'locale (cdr assocked))))
+ (delete* 'locale (cdr assocked) :key #'car)))
;;; latin.el ends here
diff -r 873d7425c1ad -r 10f179710250 lisp/obsolete.el
--- a/lisp/obsolete.el Sun Oct 09 10:39:09 2011 +0100
+++ b/lisp/obsolete.el Sun Oct 09 12:55:51 2011 +0100
@@ -263,8 +263,8 @@
(define-compatible-function-alias 'interactive-form
'function-interactive) ;GNU 21.1
-(define-compatible-function-alias 'assq-delete-all
- 'remassq) ;GNU 21.1
+(define-function 'assq-delete-all 'remassq) ;GNU 21.1
+(make-compatible 'assq-delete-all "use (delete* ITEM SEQUENCE :key
#'car)")
(defun makehash (&optional test)
"Create a new hash table.
@@ -452,5 +452,15 @@
(define-obsolete-variable-alias 'cl-macro-environment
'byte-compile-macro-environment)
+;; Actual implementations of these functions are in cl-extra.el, after
+;; cl-macs is loaded, since those implementations use #'labels and
+;; #'symbol-macrolet. These APIs were always XEmacs-specific, were never
+;; widely used, and it was always more readable and more compatible to use
+;; the CL functions.
+(make-obsolete 'remassoc "use delete* with :test #'equal, :key
#'car")
+(make-obsolete 'remassq "use delete* with :test #'eq, :key #'car")
+(make-obsolete 'remrassoc "use delete* with :test #'equal, :key
#'cdr")
+(make-obsolete 'remrassq "use delete* with :test #'eq, :key
#'cdr")
+
(provide 'obsolete)
;;; obsolete.el ends here
diff -r 873d7425c1ad -r 10f179710250 lisp/packages.el
--- a/lisp/packages.el Sun Oct 09 10:39:09 2011 +0100
+++ b/lisp/packages.el Sun Oct 09 12:55:51 2011 +0100
@@ -111,7 +111,8 @@
(list :version (car attributes))
attributes)))
(setq packages-package-list
- (cons (cons name info) (remassq name packages-package-list)))))
+ (cons (cons name info) (delete* name packages-package-list
+:test #'eq :key #'car)))))
(defun package-suppress (package file form)
"Set up a package-suppress condition FORM for FILE in PACKAGE.
diff -r 873d7425c1ad -r 10f179710250 man/ChangeLog
--- a/man/ChangeLog Sun Oct 09 10:39:09 2011 +0100
+++ b/man/ChangeLog Sun Oct 09 12:55:51 2011 +0100
@@ -1,3 +1,10 @@
+2011-10-09 Aidan Kehoe <kehoea(a)parhasard.net>
+
+ * lispref/lists.texi (Association Lists):
+ Don't document #'remassoc, #'remassq and friends in detail;
+ they're XEmacs-specific and (delete* ... :key #'car) is
+ preferable.
+
2011-10-09 Aidan Kehoe <kehoea(a)parhasard.net>
* internals/internals.texi (Top):
diff -r 873d7425c1ad -r 10f179710250 man/lispref/lists.texi
--- a/man/lispref/lists.texi Sun Oct 09 10:39:09 2011 +0100
+++ b/man/lispref/lists.texi Sun Oct 09 12:55:51 2011 +0100
@@ -1451,7 +1451,8 @@
In XEmacs Lisp, it is @emph{not} an error if an element of an
association list is not a cons cell. The alist search functions simply
ignore such elements. Many other versions of Lisp signal errors in such
-cases.
+cases, and it is good practice to avoid adding non-cons-cells to association
+lists.
Note that property lists are similar to association lists in several
respects. A property list behaves like an association list in which
@@ -1569,57 +1570,6 @@
@end smallexample
@end defun
-@defun remassoc key alist
-This function deletes by side effect any associations with key @var{key}
-in @var{alist}---i.e. it removes any elements from @var{alist} whose
-@code{car} is @code{equal} to @var{key}. The modified @var{alist} is
-returned.
-
-If the first member of @var{alist} has a @code{car} that is @code{equal}
-to @var{key}, there is no way to remove it by side effect; therefore,
-write @code{(setq foo (remassoc key foo))} to be sure of changing the
-value of @code{foo}.
-@end defun
-
-@defun remassq key alist
-This function deletes by side effect any associations with key @var{key}
-in @var{alist}---i.e. it removes any elements from @var{alist} whose
-@code{car} is @code{eq} to @var{key}. The modified @var{alist} is
-returned.
-
-This function is exactly like @code{remassoc}, but comparisons between
-@var{key} and keys in @var{alist} are done using @code{eq} instead of
-@code{equal}.
-@end defun
-
-@defun remrassoc value alist
-This function deletes by side effect any associations with value @var{value}
-in @var{alist}---i.e. it removes any elements from @var{alist} whose
-@code{cdr} is @code{equal} to @var{value}. The modified @var{alist} is
-returned.
-
-If the first member of @var{alist} has a @code{car} that is @code{equal}
-to @var{value}, there is no way to remove it by side effect; therefore,
-write @code{(setq foo (remassoc value foo))} to be sure of changing the
-value of @code{foo}.
-
-@code{remrassoc} is like @code{remassoc} except that it compares the
-@sc{cdr} of each @var{alist} association instead of the @sc{car}. You
-can think of this as ``reverse @code{remassoc}'', removing an association
-based on its value instead of its key.
-@end defun
-
-@defun remrassq value alist
-This function deletes by side effect any associations with value @var{value}
-in @var{alist}---i.e. it removes any elements from @var{alist} whose
-@code{cdr} is @code{eq} to @var{value}. The modified @var{alist} is
-returned.
-
-This function is exactly like @code{remrassoc}, but comparisons between
-@var{value} and values in @var{alist} are done using @code{eq} instead of
-@code{equal}.
-@end defun
-
@defun copy-alist alist
@cindex copying alists
This function returns a two-level deep copy of @var{alist}: it creates a
@@ -1671,6 +1621,14 @@
@end smallexample
@end defun
+For removing elements from alists, use @code{remove*} or @code{delete*} with
+appropriate @code{:key} arguments. If it is necessary that XEmacs not error
+on encountering a non-cons in such a list, there are XEmacs-specific functions
+@code{remassq}, @code{remrassq}, @code{remassoc}, and @code{remrassoc} with
+this behavior, but they are neither available under GNU Emacs nor Common Lisp.
+They are marked as obsolete, and it is preferable to fix your code to avoid
+adding non-cons objects to alists.
+
@node Property Lists
@section Property Lists
@cindex property list
diff -r 873d7425c1ad -r 10f179710250 src/ChangeLog
--- a/src/ChangeLog Sun Oct 09 10:39:09 2011 +0100
+++ b/src/ChangeLog Sun Oct 09 12:55:51 2011 +0100
@@ -1,3 +1,18 @@
+2011-10-09 Aidan Kehoe <kehoea(a)parhasard.net>
+
+ * fns.c (remassoc_no_quit):
+ * fns.c (remrassq_no_quit):
+ * fns.c (syms_of_fns):
+ * fontcolor-tty.c (Fregister_tty_color):
+ * fontcolor-tty.c (Funregister_tty_color):
+ * fontcolor-tty.c (Ffind_tty_color):
+ * lisp.h:
+ Remove Fremassq, Fremrassq, Fremassoc, Fremrassoc, they're
+ XEmacs-specific functions and Lisp callers should use (delete*
+ ... :key #'car) anyway. Keep the non-Lisp-visible _no_quit
+ versions, calling FdeleteX from C with the appropriate arguments
+ is ungainly.
+
2011-10-09 Aidan Kehoe <kehoea(a)parhasard.net>
Do a couple of non-mechanical things that would otherwise have
diff -r 873d7425c1ad -r 10f179710250 src/fns.c
--- a/src/fns.c Sun Oct 09 10:39:09 2011 +0100
+++ b/src/fns.c Sun Oct 09 12:55:51 2011 +0100
@@ -3642,41 +3642,12 @@
return sequence;
}
-DEFUN ("remassoc", Fremassoc, 2, 2, 0, /*
-Delete by side effect any elements of ALIST whose car is `equal' to KEY.
-The modified ALIST is returned. If the first member of ALIST has a car
-that is `equal' to KEY, there is no way to remove it by side effect;
-therefore, write `(setq foo (remassoc key foo))' to be sure of changing
-the value of `foo'.
-*/
- (key, alist))
-{
- EXTERNAL_LIST_LOOP_DELETE_IF (elt, alist,
- (CONSP (elt) &&
- internal_equal (key, XCAR (elt), 0)));
- return alist;
-}
-
Lisp_Object
remassoc_no_quit (Lisp_Object key, Lisp_Object alist)
{
- int speccount = specpdl_depth ();
- specbind (Qinhibit_quit, Qt);
- return unbind_to_1 (speccount, Fremassoc (key, alist));
-}
-
-DEFUN ("remassq", Fremassq, 2, 2, 0, /*
-Delete by side effect any elements of ALIST whose car is `eq' to KEY.
-The modified ALIST is returned. If the first member of ALIST has a car
-that is `eq' to KEY, there is no way to remove it by side effect;
-therefore, write `(setq foo (remassq key foo))' to be sure of changing
-the value of `foo'.
-*/
- (key, alist))
-{
- EXTERNAL_LIST_LOOP_DELETE_IF (elt, alist,
- (CONSP (elt) &&
- EQ_WITH_EBOLA_NOTICE (key, XCAR (elt))));
+ LIST_LOOP_DELETE_IF (elt, alist,
+ (CONSP (elt) &&
+ internal_equal (key, XCAR (elt), 0)));
return alist;
}
@@ -3691,36 +3662,6 @@
return alist;
}
-DEFUN ("remrassoc", Fremrassoc, 2, 2, 0, /*
-Delete by side effect any elements of ALIST whose cdr is `equal' to VALUE.
-The modified ALIST is returned. If the first member of ALIST has a car
-that is `equal' to VALUE, there is no way to remove it by side effect;
-therefore, write `(setq foo (remrassoc value foo))' to be sure of changing
-the value of `foo'.
-*/
- (value, alist))
-{
- EXTERNAL_LIST_LOOP_DELETE_IF (elt, alist,
- (CONSP (elt) &&
- internal_equal (value, XCDR (elt), 0)));
- return alist;
-}
-
-DEFUN ("remrassq", Fremrassq, 2, 2, 0, /*
-Delete by side effect any elements of ALIST whose cdr is `eq' to VALUE.
-The modified ALIST is returned. If the first member of ALIST has a car
-that is `eq' to VALUE, there is no way to remove it by side effect;
-therefore, write `(setq foo (remrassq value foo))' to be sure of changing
-the value of `foo'.
-*/
- (value, alist))
-{
- EXTERNAL_LIST_LOOP_DELETE_IF (elt, alist,
- (CONSP (elt) &&
- EQ_WITH_EBOLA_NOTICE (value, XCDR (elt))));
- return alist;
-}
-
/* Like Fremrassq, fast and unsafe; be careful */
Lisp_Object
remrassq_no_quit (Lisp_Object value, Lisp_Object alist)
@@ -11771,10 +11712,6 @@
DEFSUBR (FdeleteX);
DEFSUBR (FremoveX);
- DEFSUBR (Fremassoc);
- DEFSUBR (Fremassq);
- DEFSUBR (Fremrassoc);
- DEFSUBR (Fremrassq);
DEFSUBR (Fdelete_duplicates);
DEFSUBR (Fremove_duplicates);
DEFSUBR (Fnreverse);
diff -r 873d7425c1ad -r 10f179710250 src/fontcolor-tty.c
--- a/src/fontcolor-tty.c Sun Oct 09 10:39:09 2011 +0100
+++ b/src/fontcolor-tty.c Sun Oct 09 12:55:51 2011 +0100
@@ -80,7 +80,7 @@
CHECK_STRING (bg_string);
color = Fintern (color, Qnil);
- Vtty_color_alist = Fremassq (color, Vtty_color_alist);
+ Vtty_color_alist = remassq_no_quit (color, Vtty_color_alist);
Vtty_color_alist = Fcons (Fcons (color, Fcons (fg_string, bg_string)),
Vtty_color_alist);
@@ -95,7 +95,7 @@
CHECK_STRING (color);
color = Fintern (color, Qnil);
- Vtty_color_alist = Fremassq (color, Vtty_color_alist);
+ Vtty_color_alist = remassq_no_quit (color, Vtty_color_alist);
return Qnil;
}
@@ -111,7 +111,7 @@
CHECK_STRING (color);
- result = Fassq (Fintern (color, Qnil), Vtty_color_alist);
+ result = assq_no_quit (Fintern (color, Qnil), Vtty_color_alist);
if (!NILP (result))
return list2 (Fcar (Fcdr (result)), Fcdr (Fcdr (result)));
else
diff -r 873d7425c1ad -r 10f179710250 src/lisp.h
--- a/src/lisp.h Sun Oct 09 10:39:09 2011 +0100
+++ b/src/lisp.h Sun Oct 09 12:55:51 2011 +0100
@@ -5286,7 +5286,6 @@
MODULE_API EXFUN (Fprovide, 1);
MODULE_API EXFUN (Fput, 3);
EXFUN (Frassq, 2);
-EXFUN (Fremassq, 2);
EXFUN (Freplace_list, 2);
MODULE_API EXFUN (Freverse, 1);
EXFUN (Fsafe_length, 1);
_______________________________________________
XEmacs-Patches mailing list
XEmacs-Patches(a)xemacs.org
http://lists.xemacs.org/mailman/listinfo/xemacs-patches