1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-06 14:30:50 -08:00

Un-deprecate oset and oset-default

For discussion see the following threads:
https://lists.gnu.org/archive/html/emacs-devel/2020-05/msg00630.html
https://lists.gnu.org/archive/html/emacs-devel/2020-05/msg00674.html
https://lists.gnu.org/archive/html/emacs-devel/2020-06/msg00099.html

* lisp/emacs-lisp/eieio.el (oset, oset-default): Un-deprecate.
* lisp/emacs-lisp/eieio-core.el (eieio-oref): Declare gv-setter here
instead of in lisp/emacs-lisp/eieio.el.  Suggested by
Stefan Monnier <monnier@iro.umontreal.ca>.
(eieio-oref-default): Add gv-setter declaration.
* etc/NEWS: Announce these changes.
* doc/misc/eieio.texi (Accessing Slots): Document oref and
oref-default as generalized variables.  Consistently document
getters before setters.
* test/lisp/emacs-lisp/eieio-tests/eieio-tests.el: Use
lexical-binding.
(eieio-test-13-init-methods): Simplify.
(eieio-test-33-instance-tracker): Declare IT-list as special.
This commit is contained in:
Basil L. Contovounesios 2020-06-03 17:35:59 +01:00
parent acd2cb28ef
commit 8bcc781bc7
5 changed files with 35 additions and 27 deletions

View file

@ -698,6 +698,27 @@ and argument-order conventions are similar to those used for
referencing vectors (@pxref{Vectors,,,elisp,GNU Emacs Lisp Reference referencing vectors (@pxref{Vectors,,,elisp,GNU Emacs Lisp Reference
Manual}). Manual}).
@defmac oref obj slot
@anchor{oref}
This macro retrieves the value stored in @var{obj} in the named
@var{slot}. Slot names are determined by @code{defclass} which
creates the slot.
This is a generalized variable that can be used with @code{setf} to
modify the value stored in @var{slot}. @xref{Generalized
Variables,,,elisp,GNU Emacs Lisp Reference Manual}.
@end defmac
@defmac oref-default class slot
@anchor{oref-default}
This macro returns the value of the class-allocated @var{slot} from
@var{class}.
This is a generalized variable that can be used with @code{setf} to
modify the value stored in @var{slot}. @xref{Generalized
Variables,,,elisp,GNU Emacs Lisp Reference Manual}.
@end defmac
@defmac oset object slot value @defmac oset object slot value
This macro sets the value behind @var{slot} to @var{value} in This macro sets the value behind @var{slot} to @var{value} in
@var{object}. It returns @var{value}. @var{object}. It returns @var{value}.
@ -716,17 +737,6 @@ changed, this can be arranged by simply executing this bit of code:
@end example @end example
@end defmac @end defmac
@defmac oref obj slot
@anchor{oref}
Retrieve the value stored in @var{obj} in the slot named by @var{slot}.
Slot is the name of the slot when created by @dfn{defclass}.
@end defmac
@defmac oref-default class slot
@anchor{oref-default}
Get the value of the class-allocated @var{slot} from @var{class}.
@end defmac
The following accessors are defined by CLOS to reference or modify The following accessors are defined by CLOS to reference or modify
slot values, and use the previously mentioned set/ref routines. slot values, and use the previously mentioned set/ref routines.

View file

@ -112,7 +112,12 @@ setting the variable 'auto-save-visited-mode' buffer-locally to nil.
** New bindings in occur-mode, 'next-error-no-select' bound to 'n' and ** New bindings in occur-mode, 'next-error-no-select' bound to 'n' and
'previous-error-no-select' bound to 'p'. 'previous-error-no-select' bound to 'p'.
** EIEIO: 'oset' and 'oset-default' are declared obsolete. ** EIEIO
+++
*** The macro 'oref-default' can now be used with 'setf'.
It is now defined as a generalized variable that can be used with
'setf' to modify the value stored in a given class slot.
** New minor mode 'cl-font-lock-built-in-mode' for `lisp-mode'. ** New minor mode 'cl-font-lock-built-in-mode' for `lisp-mode'.
The mode provides refined highlighting of built-in functions, types, The mode provides refined highlighting of built-in functions, types,

View file

@ -730,7 +730,8 @@ Argument FN is the function calling this verifier."
(guard (not (memq name eieio--known-slot-names)))) (guard (not (memq name eieio--known-slot-names))))
(macroexp--warn-and-return (macroexp--warn-and-return
(format-message "Unknown slot `%S'" name) exp 'compile-only)) (format-message "Unknown slot `%S'" name) exp 'compile-only))
(_ exp))))) (_ exp))))
(gv-setter eieio-oset))
(cl-check-type slot symbol) (cl-check-type slot symbol)
(cl-check-type obj (or eieio-object class)) (cl-check-type obj (or eieio-object class))
(let* ((class (cond ((symbolp obj) (let* ((class (cond ((symbolp obj)
@ -755,6 +756,7 @@ Argument FN is the function calling this verifier."
(defun eieio-oref-default (obj slot) (defun eieio-oref-default (obj slot)
"Do the work for the macro `oref-default' with similar parameters. "Do the work for the macro `oref-default' with similar parameters.
Fills in OBJ's SLOT with its default value." Fills in OBJ's SLOT with its default value."
(declare (gv-setter eieio-oset-default))
(cl-check-type obj (or eieio-object class)) (cl-check-type obj (or eieio-object class))
(cl-check-type slot symbol) (cl-check-type slot symbol)
(let* ((cl (cond ((symbolp obj) (cl--find-class obj)) (let* ((cl (cond ((symbolp obj) (cl--find-class obj))

View file

@ -513,8 +513,7 @@ The CLOS function `class-direct-subclasses' is aliased to this function."
"Set the value in OBJ for slot SLOT to VALUE. "Set the value in OBJ for slot SLOT to VALUE.
SLOT is the slot name as specified in `defclass' or the tag created SLOT is the slot name as specified in `defclass' or the tag created
with in the :initarg slot. VALUE can be any Lisp object." with in the :initarg slot. VALUE can be any Lisp object."
(declare (obsolete "use (setf (oref ..) ..) instead" "28.1") (declare (debug (form symbolp form)))
(debug (form symbolp form)))
`(eieio-oset ,obj (quote ,slot) ,value)) `(eieio-oset ,obj (quote ,slot) ,value))
(defmacro oset-default (class slot value) (defmacro oset-default (class slot value)
@ -522,8 +521,7 @@ with in the :initarg slot. VALUE can be any Lisp object."
The default value is usually set with the :initform tag during class The default value is usually set with the :initform tag during class
creation. This allows users to change the default behavior of classes creation. This allows users to change the default behavior of classes
after they are created." after they are created."
(declare (obsolete "use (setf (oref-default ..) ..) instead" "28.1") (declare (debug (form symbolp form)))
(debug (form symbolp form)))
`(eieio-oset-default ,class (quote ,slot) ,value)) `(eieio-oset-default ,class (quote ,slot) ,value))
;;; CLOS queries into classes and slots ;;; CLOS queries into classes and slots
@ -647,14 +645,6 @@ If SLOT is unbound, do nothing."
nil nil
(eieio-oset object slot (delete item (eieio-oref object slot))))) (eieio-oset object slot (delete item (eieio-oref object slot)))))
;;; Here are some CLOS items that need the CL package
;;
;; FIXME: Shouldn't this be a more complex gv-expander which extracts the
;; common code between oref and oset, so as to reduce the redundant work done
;; in (push foo (oref bar baz)), like we do for the `nth' expander?
(gv-define-simple-setter eieio-oref eieio-oset)
;;; ;;;
;; We want all objects created by EIEIO to have some default set of ;; We want all objects created by EIEIO to have some default set of

View file

@ -1,4 +1,4 @@
;;; eieio-tests.el -- eieio tests routines ;;; eieio-tests.el -- eieio test routines -*- lexical-binding: t -*-
;; Copyright (C) 1999-2003, 2005-2010, 2012-2020 Free Software ;; Copyright (C) 1999-2003, 2005-2010, 2012-2020 Free Software
;; Foundation, Inc. ;; Foundation, Inc.
@ -356,7 +356,7 @@ METHOD is the method that was attempting to be called."
(oset a test-tag 1)) (oset a test-tag 1))
(let ((ca (class-a))) (let ((ca (class-a)))
(should-not (/= (oref ca test-tag) 2)))) (should (= (oref ca test-tag) 2))))
;;; Perform slot testing ;;; Perform slot testing
@ -852,6 +852,7 @@ Subclasses to override slot attributes.")
"Instance Tracker test object.") "Instance Tracker test object.")
(ert-deftest eieio-test-33-instance-tracker () (ert-deftest eieio-test-33-instance-tracker ()
(defvar IT-list)
(let (IT-list IT1) (let (IT-list IT1)
(should (setq IT1 (IT))) (should (setq IT1 (IT)))
;; The instance tracker must find this ;; The instance tracker must find this