mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-11 10:20:33 -08:00
Single string literal in body is return value only, not doc string
A function or macro body consisting of a single string literal now only uses it as a return value. Previously, it had the dual uses as return value and doc string, which was never what the programmer wanted and had some inconvenient consequences (bug#69387). This change applies to `lambda`, `defun`, `defsubst` and `defmacro` forms; most other defining forms already worked in the sensible way. * lisp/emacs-lisp/bytecomp.el (byte-compile-lambda): Don't use a lone string literal as doc string. * test/lisp/emacs-lisp/bytecomp-resources/warn-wide-docstring-defun.el (foo): Update docstring warning test. * doc/lispref/functions.texi (Function Documentation): Update. * etc/NEWS: Announce.
This commit is contained in:
parent
8aabd83574
commit
61b2f5f96b
4 changed files with 28 additions and 13 deletions
|
|
@ -498,13 +498,12 @@ indentation of the following lines is inside the string; what looks
|
|||
nice in the source code will look ugly when displayed by the help
|
||||
commands.
|
||||
|
||||
You may wonder how the documentation string could be optional, since
|
||||
there are required components of the function that follow it (the body).
|
||||
Since evaluation of a string returns that string, without any side effects,
|
||||
it has no effect if it is not the last form in the body. Thus, in
|
||||
practice, there is no confusion between the first form of the body and the
|
||||
documentation string; if the only body form is a string then it serves both
|
||||
as the return value and as the documentation.
|
||||
A documentation string must always be followed by at least one Lisp
|
||||
expression; otherwise, it is not a documentation string at all but the
|
||||
single expression of the body and used as the return value.
|
||||
When there is no meaningful value to return from a function, it is
|
||||
standard practice to return @code{nil} by adding it after the
|
||||
documentation string.
|
||||
|
||||
The last line of the documentation string can specify calling
|
||||
conventions different from the actual function arguments. Write
|
||||
|
|
|
|||
16
etc/NEWS
16
etc/NEWS
|
|
@ -1818,6 +1818,22 @@ Tree-sitter conditionally sets 'forward-sexp-function' for major modes
|
|||
that have defined 'sexp' in 'treesit-thing-settings' to enable
|
||||
sexp-related motion commands.
|
||||
|
||||
+++
|
||||
** Returned strings are never docstrings.
|
||||
Functions and macros whose bodies consist of a single string literal now
|
||||
only return that string; it is not used as a docstring. Example:
|
||||
|
||||
(defun sing-a-song ()
|
||||
"Sing a song.")
|
||||
|
||||
The above function returns the string '"Sing a song."' but has no
|
||||
docstring. Previously, that string was used as both a docstring and
|
||||
return value, which was never what the programmer wanted. If you want
|
||||
the string to be a docstring, add an explicit return value.
|
||||
|
||||
This change applies to 'defun', 'defsubst', 'defmacro' and 'lambda'
|
||||
forms; other defining forms such as 'cl-defun' already worked this way.
|
||||
|
||||
** New or changed byte-compilation warnings
|
||||
|
||||
---
|
||||
|
|
|
|||
|
|
@ -3061,12 +3061,11 @@ lambda-expression."
|
|||
(append (if (not lexical-binding) arglistvars)
|
||||
byte-compile-bound-variables))
|
||||
(body (cdr (cdr fun)))
|
||||
(doc (if (stringp (car body))
|
||||
;; Treat a final string literal as a value, not a doc string.
|
||||
(doc (if (and (cdr body) (stringp (car body)))
|
||||
(prog1 (car body)
|
||||
;; Discard the doc string from the body
|
||||
;; unless it is the last element of the body.
|
||||
(if (cdr body)
|
||||
(setq body (cdr body))))))
|
||||
;; Discard the doc string from the body.
|
||||
(setq body (cdr body)))))
|
||||
(int (assq 'interactive body))
|
||||
command-modes)
|
||||
(when lexical-binding
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
;;; -*- lexical-binding: t -*-
|
||||
(defun foo ()
|
||||
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
|
||||
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
||||
nil)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue