Introduce element &error into edebug specification lists for macros

This fixes bug #37540.

* lisp/emacs-lisp/edebug.el (top level): New entry for &error in alist used to
associate elements with their handling functions.
(edebug-match-&error): New function.
(nested-backquote-form): Use the new element &error to abort instrumentation
on encountering a three deep nesting of backquotes (without intervening
commas).

* doc/lispref/edebug.texi (Specification List): Add an entry for &error.

* etc/NEWS: Add an entry for &error.
This commit is contained in:
Alan Mackenzie 2020-01-17 21:53:13 +00:00
parent d97a77c481
commit 8d2fecdf6c
3 changed files with 24 additions and 0 deletions

View file

@ -1362,6 +1362,11 @@ while matching the remainder of the specifications at this level. This
is primarily used to generate more specific syntax error messages. See
@ref{Backtracking}, for more details. Also see the @code{let} example.
@item &error
@code{&error} should be followed by a string, an error message, in the
edebug-spec; it aborts the instrumentation, displaying the message in
the minibuffer.
@item @var{other-symbol}
@cindex indirect specifications
Any other symbol in a specification list may be a predicate or an

View file

@ -48,6 +48,13 @@ It was declared obsolete in Emacs 27.1.
** The sb-image.el library is now marked obsolete.
This file was a compatibility kludge which is no longer needed.
** Edebug
+++
*** Edebug specification lists can use the new keyword '&error', which
unconditionally aborts the current edebug instrumentation with the
supplied error message.
* New Modes and Packages in Emacs 28.1

View file

@ -1714,6 +1714,7 @@ contains a circular object."
(cl-macrolet-body . edebug-match-cl-macrolet-body)
(&not . edebug-match-&not)
(&key . edebug-match-&key)
(&error . edebug-match-&error)
(place . edebug-match-place)
(gate . edebug-match-gate)
;; (nil . edebug-match-nil) not this one - special case it.
@ -1847,6 +1848,15 @@ contains a circular object."
(car (cdr pair))))
specs))))
(defun edebug-match-&error (cursor specs)
;; Signal an error, using the following string in the spec as argument.
(let ((error-string (car specs))
(edebug-error-point (edebug-before-offset cursor)))
(goto-char edebug-error-point)
(error "%s"
(if (stringp error-string)
error-string
"String expected after &error in edebug-spec"))))
(defun edebug-match-gate (_cursor)
;; Simply set the gate to prevent backtracking at this level.
@ -2216,6 +2226,8 @@ into `edebug--cl-macrolet-defs' which is checked in `edebug-list-form-args'."
(def-edebug-spec nested-backquote-form
(&or
("`" &error "Triply nested backquotes (without commas \"between\" them) \
are too difficult to instrument")
;; Allow instrumentation of any , or ,@ contained within the (\, ...) or
;; (\,@ ...) matched on the next line.
([&or "," ",@"] backquote-form)