]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/emacs-lisp/pcase.el (pcase-UPAT, pcase-QPAT): New edebug specs.
authorJohan Bockgård <bojohan@gnu.org>
Mon, 11 Jun 2012 00:46:21 +0000 (20:46 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Mon, 11 Jun 2012 00:46:21 +0000 (20:46 -0400)
(pcase, pcase-let*, pcase-dolist): Use them.

lisp/ChangeLog
lisp/emacs-lisp/pcase.el

index 606e2430a815d4a16ed850dfff509faee54ab63f..026e84058ef3cbe3ba79c0dd441eba2a55d853a5 100644 (file)
@@ -1,3 +1,8 @@
+2012-06-11  Johan Bockgård  <bojohan@gnu.org>
+
+       * emacs-lisp/pcase.el (pcase-UPAT, pcase-QPAT): New edebug specs.
+       (pcase, pcase-let*, pcase-dolist): Use them.
+
 2012-06-11  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * emacs-lisp/pcase.el (pcase--let*): New function.
index 61c3aef5b21021bbf5f40ce39418fc3bcbe1262f..81cffae04bf6127691f06b19ad145e62eaad5f7c 100644 (file)
 
 (defconst pcase--dontcare-upats '(t _ dontcare))
 
+(def-edebug-spec
+  pcase-UPAT
+  (&or symbolp
+       ("or" &rest pcase-UPAT)
+       ("and" &rest pcase-UPAT)
+       ("`" pcase-QPAT)
+       ("guard" form)
+       ("let" pcase-UPAT form)
+       ("pred"
+        &or lambda-expr
+        ;; Punt on macros/special forms.
+        (functionp &rest form)
+        sexp)
+       sexp))
+
+(def-edebug-spec
+  pcase-QPAT
+  (&or ("," pcase-UPAT)
+       (pcase-QPAT . pcase-QPAT)
+       sexp))
+
 ;;;###autoload
 (defmacro pcase (exp &rest cases)
   "Perform ML-style pattern matching on EXP.
@@ -98,7 +119,7 @@ PRED patterns can refer to variables bound earlier in the pattern.
 E.g. you can match pairs where the cdr is larger than the car with a pattern
 like `(,a . ,(pred (< a))) or, with more checks:
 `(,(and a (pred numberp)) . ,(and (pred numberp) (pred (< a))))"
-  (declare (indent 1) (debug cl-case))  ;FIXME: edebug `guard' and vars.
+  (declare (indent 1) (debug (form &rest (pcase-UPAT body))))
   ;; We want to use a weak hash table as a cache, but the key will unavoidably
   ;; be based on `exp' and `cases', yet `cases' is a fresh new list each time
   ;; we're called so it'll be immediately GC'd.  So we use (car cases) as key
@@ -144,7 +165,7 @@ like `(,a . ,(pred (< a))) or, with more checks:
 BODY should be an expression, and BINDINGS should be a list of bindings
 of the form (UPAT EXP)."
   (declare (indent 1)
-           (debug ((&rest (sexp &optional form)) body)))
+           (debug ((&rest (pcase-UPAT &optional form)) body)))
   (let ((cached (gethash bindings pcase--memoize)))
     ;; cached = (BODY . EXPANSION)
     (if (equal (car cached) body)
@@ -174,7 +195,7 @@ of the form (UPAT EXP)."
       `(let ,(nreverse bindings) (pcase-let* ,matches ,@body)))))
 
 (defmacro pcase-dolist (spec &rest body)
-  (declare (indent 1))
+  (declare (indent 1) (debug ((pcase-UPAT form) body)))
   (if (pcase--trivial-upat-p (car spec))
       `(dolist ,spec ,@body)
     (let ((tmpvar (make-symbol "x")))