GNU bug report logs - #16567
24.3.50; pcase should signal an error if no case matches

Previous Next

Package: emacs;

Reported by: Helmut Eller <eller.helmut <at> gmail.com>

Date: Mon, 27 Jan 2014 09:24:01 UTC

Severity: wishlist

Found in version 24.3.50

Fixed in version 25.1

Done: Leo Liu <sdl.web <at> gmail.com>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Leo Liu <sdl.web <at> gmail.com>
To: Stefan Monnier <monnier <at> IRO.UMontreal.CA>
Cc: 16567 <at> debbugs.gnu.org, Glenn Morris <rgm <at> gnu.org>, Helmut Eller <eller.helmut <at> gmail.com>
Subject: bug#16567: 24.3.50; pcase should signal an error if no case matches
Date: Fri, 12 Sep 2014 10:35:29 +0800
Stefan,

Which name would you prefer, `epcase' or 'pcasex'? Do you see any
problems with the following patch (assume `pcasex' for now)?

Thanks, Leo

=== modified file 'lisp/emacs-lisp/lisp-mode.el'
--- lisp/emacs-lisp/lisp-mode.el	2014-06-19 14:03:45 +0000
+++ lisp/emacs-lisp/lisp-mode.el	2014-09-12 02:28:44 +0000
@@ -197,7 +197,7 @@
               (el-vdefs '("defconst" "defcustom" "defvaralias" "defvar-local"
                           "defface"))
               (el-tdefs '("defgroup" "deftheme"))
-              (el-kw '("while-no-input" "letrec" "pcase" "pcase-let"
+              (el-kw '("while-no-input" "letrec" "pcase" "pcasex" "pcase-let"
                        "pcase-let*" "save-restriction" "save-excursion"
                        "save-selected-window"
                        ;; "eval-after-load" "eval-next-after-load"

=== modified file 'lisp/emacs-lisp/pcase.el'
--- lisp/emacs-lisp/pcase.el	2014-09-06 00:59:00 +0000
+++ lisp/emacs-lisp/pcase.el	2014-09-10 10:44:59 +0000
@@ -68,6 +68,8 @@
 
 (defconst pcase--dontcare-upats '(t _ pcase--dontcare))
 
+(defvar pcase--dontwarn-upats '(pcase--dontcare))
+
 (def-edebug-spec
   pcase-UPAT
   (&or symbolp
@@ -148,6 +150,15 @@
         ;; (puthash (car cases) `(,exp ,cases ,@expansion) pcase--memoize-2)
         expansion))))
 
+;;;###autoload
+(defmacro pcasex (exp &rest cases)
+  "The exhausitive version of `pcase' (which see)."
+  (declare (indent 1) (debug pcase))
+  (let* ((x (make-symbol "x"))
+         (pcase--dontwarn-upats (cons x pcase--dontwarn-upats)))
+    (pcase--expand
+     exp (append cases `((,x (error "No clause matching `%S'" ,x)))))))
+
 (defun pcase--let* (bindings body)
   (cond
    ((null bindings) (macroexp-progn body))
@@ -280,7 +291,8 @@
                              vars))))
                      cases))))
       (dolist (case cases)
-        (unless (or (memq case used-cases) (eq (car case) 'pcase--dontcare))
+        (unless (or (memq case used-cases)
+                    (memq (car case) pcase--dontwarn-upats))
           (message "Redundant pcase pattern: %S" (car case))))
       (macroexp-let* defs main))))




This bug report was last modified 10 years and 290 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.