summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp/edebug.el
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2021-02-12 12:17:40 -0500
committerStefan Monnier <monnier@iro.umontreal.ca>2021-02-12 12:17:40 -0500
commitc7b35ea3060b90ed68a933eed29e85dd2d567e3e (patch)
tree505db1d4788c60496a06b975a1915db73989a799 /lisp/emacs-lisp/edebug.el
parent6ae731e04f261b9139fbe3573822a381dc3577d3 (diff)
downloademacs-c7b35ea3060b90ed68a933eed29e85dd2d567e3e.tar.gz
emacs-c7b35ea3060b90ed68a933eed29e85dd2d567e3e.tar.bz2
emacs-c7b35ea3060b90ed68a933eed29e85dd2d567e3e.zip
* lisp/emacs-lisp/edebug.el (edebug--handle-&-spec-op) <&lookup>: New method
* doc/lispref/edebug.texi (Specification List): Document it. * lisp/emacs-lisp/pcase.el (pcase-PAT): Use it. (pcase-MACRO): Remove Edebug element. (pcase--get-edebug-spec): New function. (pcase--edebug-match-macro): Remove function.
Diffstat (limited to 'lisp/emacs-lisp/edebug.el')
-rw-r--r--lisp/emacs-lisp/edebug.el17
1 files changed, 17 insertions, 0 deletions
diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el
index 04a4829c5e6..782299454ea 100644
--- a/lisp/emacs-lisp/edebug.el
+++ b/lisp/emacs-lisp/edebug.el
@@ -55,6 +55,7 @@
(require 'backtrace)
(require 'macroexp)
(require 'cl-lib)
+(require 'seq)
(eval-when-compile (require 'pcase))
;;; Options
@@ -1866,6 +1867,22 @@ contains a circular object."
(apply #'edebug-no-match cursor "Expected one of" original-specs))
))
+(cl-defmethod edebug--handle-&-spec-op ((_ (eql &lookup)) cursor specs)
+ "Compute the specs for `&lookup SPEC FUN ARGS...'.
+Extracts the head of the data by matching it against SPEC,
+and then matches the rest against the output of (FUN ARGS... HEAD)."
+ (pcase-let*
+ ((`(,spec ,fun . ,args) specs)
+ (exps (edebug-cursor-expressions cursor))
+ (instrumented-head (edebug-match-one-spec cursor (or spec 'sexp)))
+ (consumed (- (length exps)
+ (length (edebug-cursor-expressions cursor))))
+ (newspecs (apply fun (append args (seq-subseq exps 0 consumed)))))
+ (cl-assert (eq (edebug-cursor-expressions cursor) (nthcdr consumed exps)))
+ ;; FIXME: What'd be the difference if we used `edebug-match-sublist',
+ ;; which is what `edebug-list-form-args' uses for the similar purpose
+ ;; when matching "normal" forms?
+ (append instrumented-head (edebug-match cursor newspecs))))
(cl-defmethod edebug--handle-&-spec-op ((_ (eql &not)) cursor specs)
;; If any specs match, then fail