1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-09 07:40:39 -08:00

* lisp/emacs-lisp/eieio-base.el: Use lexical-binding and cl-lib.

* lisp/emacs-lisp/eieio-core.el: Use lexical-binding and cl-lib.
(list-of): New type.
(eieio--typep): Remove.
(eieio-perform-slot-validation): Use cl-typep instead.
* lisp/emacs-lisp/eieio.el: Use lexical-binding drop non-GV fallback.
(defclass, defgeneric, defmethod): Add doc-string position.
(with-slots): Require cl-lib.
* lisp/emacs-lisp/cl-macs.el (cl--make-type-test): Avoid ((lambda ..) ..).
This commit is contained in:
Stefan Monnier 2014-10-17 01:09:24 -04:00
parent 60727a5494
commit 942501730f
5 changed files with 96 additions and 126 deletions

View file

@ -1,4 +1,4 @@
;;; eieio.el --- Enhanced Implementation of Emacs Interpreted Objects
;;; eieio.el --- Enhanced Implementation of Emacs Interpreted Objects -*- lexical-binding:t -*-
;;; or maybe Eric's Implementation of Emacs Interpreted Objects
;; Copyright (C) 1995-1996, 1998-2014 Free Software Foundation, Inc.
@ -44,8 +44,6 @@
;;; Code:
(eval-when-compile (require 'cl)) ;FIXME: Use cl-lib!
(defvar eieio-version "1.4"
"Current version of EIEIO.")
@ -115,6 +113,7 @@ Options in CLOS not supported in EIEIO:
Due to the way class options are set up, you can add any tags you wish,
and reference them using the function `class-option'."
(declare (doc-string 4))
;; This is eval-and-compile only to silence spurious compiler warnings
;; about functions and variables not known to be defined.
;; When eieio-defclass code is merged here and this becomes
@ -155,7 +154,7 @@ a string."
;;; CLOS methods and generics
;;
(defmacro defgeneric (method args &optional doc-string)
(defmacro defgeneric (method _args &optional doc-string)
"Create a generic function METHOD.
DOC-STRING is the base documentation for this class. A generic
function has no body, as its purpose is to decide which method body
@ -163,6 +162,7 @@ is appropriate to use. Uses `defmethod' to create methods, and calls
`defgeneric' for you. With this implementation the ARGS are
currently ignored. You can use `defgeneric' to apply specialized
top level documentation to a method."
(declare (doc-string 3))
`(eieio--defalias ',method
(eieio--defgeneric-init-form ',method ,doc-string)))
@ -191,6 +191,7 @@ Summary:
((typearg class-name) arg2 &optional opt &rest rest)
\"doc-string\"
body)"
(declare (doc-string 3))
(let* ((key (if (keywordp (car args)) (pop args)))
(params (car args))
(arg1 (car params))
@ -246,6 +247,7 @@ Where each VAR is the local variable given to the associated
SLOT. A slot specified without a variable name is given a
variable name of the same name as the slot."
(declare (indent 2))
(require 'cl-lib)
;; Transform the spec-list into a cl-symbol-macrolet spec-list.
(let ((mappings (mapcar (lambda (entry)
(let ((var (if (listp entry) (car entry) entry))
@ -523,7 +525,7 @@ Use `next-method-p' to find out if there is a next method to call."
(next (car eieio-generic-call-next-method-list))
)
(if (or (not next) (not (car next)))
(apply 'no-next-method (car newargs) (cdr newargs))
(apply #'no-next-method (car newargs) (cdr newargs))
(let* ((eieio-generic-call-next-method-list
(cdr eieio-generic-call-next-method-list))
(eieio-generic-call-arglst newargs)
@ -535,27 +537,7 @@ Use `next-method-p' to find out if there is a next method to call."
;;; Here are some CLOS items that need the CL package
;;
(defsetf eieio-oref eieio-oset)
(if (eval-when-compile (fboundp 'gv-define-expander))
;; Not needed for Emacs>=24.3 since gv.el's setf expands macros and
;; follows aliases.
nil
(defsetf slot-value eieio-oset)
;; The below setf method was written by Arnd Kohrs <kohrs@acm.org>
(define-setf-method oref (obj slot)
(with-no-warnings
(require 'cl)
(let ((obj-temp (gensym))
(slot-temp (gensym))
(store-temp (gensym)))
(list (list obj-temp slot-temp)
(list obj `(quote ,slot))
(list store-temp)
(list 'set-slot-value obj-temp slot-temp
store-temp)
(list 'slot-value obj-temp slot-temp))))))
(gv-define-simple-setter eieio-oref eieio-oset)
;;;
@ -651,7 +633,7 @@ dynamically set from SLOTS."
"Method invoked when an attempt to access a slot in OBJECT fails.")
(defmethod slot-missing ((object eieio-default-superclass) slot-name
operation &optional new-value)
_operation &optional _new-value)
"Method invoked when an attempt to access a slot in OBJECT fails.
SLOT-NAME is the name of the failed slot, OPERATION is the type of access
that was requested, and optional NEW-VALUE is the value that was desired
@ -684,7 +666,7 @@ EIEIO can only dispatch on the first argument, so the first two are swapped."
"Called if there are no implementations for OBJECT in METHOD.")
(defmethod no-applicable-method ((object eieio-default-superclass)
method &rest args)
method &rest _args)
"Called if there are no implementations for OBJECT in METHOD.
OBJECT is the object which has no method implementation.
ARGS are the arguments that were passed to METHOD.
@ -734,7 +716,7 @@ first and modify the returned object.")
(defgeneric destructor (this &rest params)
"Destructor for cleaning up any dynamic links to our object.")
(defmethod destructor ((this eieio-default-superclass) &rest params)
(defmethod destructor ((_this eieio-default-superclass) &rest _params)
"Destructor for cleaning up any dynamic links to our object.
Argument THIS is the object being destroyed. PARAMS are additional
ignored parameters."
@ -760,7 +742,7 @@ Implement this function and specify STRINGS in a call to
`call-next-method' to provide additional summary information.
When passing in extra strings from child classes, always remember
to prepend a space."
(eieio-object-name this (apply 'concat strings)))
(eieio-object-name this (apply #'concat strings)))
(defvar eieio-print-depth 0
"When printing, keep track of the current indentation depth.")
@ -859,7 +841,7 @@ this object."
;;; Unimplemented functions from CLOS
;;
(defun change-class (obj class)
(defun change-class (_obj _class)
"Change the class of OBJ to type CLASS.
This may create or delete slots, but does not affect the return value
of `eq'."
@ -879,7 +861,8 @@ Optional argument NOESCAPE is passed to `prin1-to-string' when appropriate."
((eieio-object-p object) (object-print object))
((and (listp object) (or (class-p (car object))
(eieio-object-p (car object))))
(concat "(" (mapconcat 'eieio-edebug-prin1-to-string object " ") ")"))
(concat "(" (mapconcat #'eieio-edebug-prin1-to-string object " ")
")"))
(t (prin1-to-string object noescape))))
(add-hook 'edebug-setup-hook