summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp
diff options
context:
space:
mode:
authorGlenn Morris <rgm@gnu.org>2018-06-23 07:50:59 -0700
committerGlenn Morris <rgm@gnu.org>2018-06-23 07:50:59 -0700
commitb81e193ac0c4644d041a4eb4fa4cb62cf9446bd6 (patch)
tree837db70e4aff8fce66886b0cfbe82dbccdea4b06 /lisp/emacs-lisp
parent4df361557c3f1b4039fa59d23cd1ed66c2ca5b1c (diff)
parent5cb3991a4f78b39a2c95b22a5159ae3ba779397e (diff)
downloademacs-b81e193ac0c4644d041a4eb4fa4cb62cf9446bd6.tar.gz
emacs-b81e193ac0c4644d041a4eb4fa4cb62cf9446bd6.tar.bz2
emacs-b81e193ac0c4644d041a4eb4fa4cb62cf9446bd6.zip
Merge from origin/emacs-26
5cb3991 Fix a typo in emacs-lisp-intro.texi d6aa55e Avoid segfaults in replace-buffer-contents with large buffers d22b8d1 Adjust for scaling for mode-line popup menus (Bug#31880) 3d2e3dc Change name of `seqp' argument (Bug#26411) 40e1db8 Change index of ";" to better reflect it's usage (Bug#31623) d289e7e Fix bug of 'mouse-drag-and-drop-region' to detect edges of re... e292c09 Fix #'fun handling inside `labels' (Bug#31792)
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r--lisp/emacs-lisp/cl-macs.el17
-rw-r--r--lisp/emacs-lisp/cl.el7
-rw-r--r--lisp/emacs-lisp/seq.el6
3 files changed, 20 insertions, 10 deletions
diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
index d7e4b4e611a..b50961adac9 100644
--- a/lisp/emacs-lisp/cl-macs.el
+++ b/lisp/emacs-lisp/cl-macs.el
@@ -1998,13 +1998,16 @@ a `let' form, except that the list of symbols can be computed at run-time."
;;;###autoload
(defmacro cl-flet (bindings &rest body)
"Make local function definitions.
-Like `cl-labels' but the definitions are not recursive.
-Each binding can take the form (FUNC EXP) where
+Each definition can take the form (FUNC EXP) where
FUNC is the function name, and EXP is an expression that returns the
function value to which it should be bound, or it can take the more common
form \(FUNC ARGLIST BODY...) which is a shorthand
for (FUNC (lambda ARGLIST BODY)).
+FUNC is defined only within FORM, not BODY, so you can't write
+recursive function definitions. Use `cl-labels' for that. See
+info node `(cl) Function Bindings' for details.
+
\(fn ((FUNC ARGLIST BODY...) ...) FORM...)"
(declare (indent 1) (debug ((&rest (cl-defun)) cl-declarations body)))
(let ((binds ()) (newenv macroexpand-all-environment))
@@ -2046,9 +2049,13 @@ Like `cl-flet' but the definitions can refer to previous ones.
;;;###autoload
(defmacro cl-labels (bindings &rest body)
- "Make temporary function bindings.
-The bindings can be recursive and the scoping is lexical, but capturing them
-in closures will only work if `lexical-binding' is in use.
+ "Make local (recursive) function definitions.
+Each definition can take the form (FUNC ARGLIST BODY...) where
+FUNC is the function name, ARGLIST its arguments, and BODY the
+forms of the function body. FUNC is defined in any BODY, as well
+as FORM, so you can write recursive and mutually recursive
+function definitions. See info node `(cl) Function Bindings' for
+details.
\(fn ((FUNC ARGLIST BODY...) ...) FORM...)"
(declare (indent 1) (debug cl-flet))
diff --git a/lisp/emacs-lisp/cl.el b/lisp/emacs-lisp/cl.el
index d53c8e0bbcf..f6643158d2d 100644
--- a/lisp/emacs-lisp/cl.el
+++ b/lisp/emacs-lisp/cl.el
@@ -466,9 +466,12 @@ rather than relying on `lexical-binding'."
(push var sets)
(push (cons (car binding)
`(lambda (&rest cl-labels-args)
- (cl-list* 'funcall ',var
- cl-labels-args)))
+ (if (eq (car cl-labels-args) cl--labels-magic)
+ (list cl--labels-magic ',var)
+ (cl-list* 'funcall ',var cl-labels-args))))
newenv)))
+ ;; `lexical-let' adds `cl--function-convert' (which calls
+ ;; `cl--labels-convert') as a macroexpander for `function'.
(macroexpand-all `(lexical-let ,vars (setq ,@sets) ,@body) newenv)))
;; Generalized variables are provided by gv.el, but some details are
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
index 5d6ab7e057f..b40c424e303 100644
--- a/lisp/emacs-lisp/seq.el
+++ b/lisp/emacs-lisp/seq.el
@@ -127,9 +127,9 @@ the sequence, and its index within the sequence."
(setq index (1+ index)))
sequence)))
-(cl-defgeneric seqp (sequence)
- "Return non-nil if SEQUENCE is a sequence, nil otherwise."
- (sequencep sequence))
+(cl-defgeneric seqp (object)
+ "Return non-nil if OBJECT is a sequence, nil otherwise."
+ (sequencep object))
(cl-defgeneric seq-copy (sequence)
"Return a shallow copy of SEQUENCE."