]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/emacs-lisp/pcase.el (pcase-setq): Align its semantics with `pcase-let`
authorStefan Monnier <monnier@iro.umontreal.ca>
Thu, 12 Aug 2021 15:04:30 +0000 (11:04 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Thu, 12 Aug 2021 15:04:30 +0000 (11:04 -0400)
* test/lisp/emacs-lisp/pcase-tests.el (pcase-tests-setq): Rename from
pcase-setq and ajust accordingly.

lisp/emacs-lisp/pcase.el
test/lisp/emacs-lisp/pcase-tests.el

index d111d9e41f8a6466ef9428895ba2b9c642c0420e..63b187be02b552eceee7d730d022c6ea383dcbd9 100644 (file)
@@ -326,7 +326,8 @@ Evaluation happens sequentially as in `setq' (not in parallel).
 
 An example: (pcase-setq `((,a) [(,b)]) '((1) [(2)]))
 
-When a PATTERN doesn't match it's VALUE, the pair is silently skipped.
+VAL is presumed to match PAT.  Failure to match may signal an error or go
+undetected, binding variables to arbitrary values, such as nil.
 
 \(fn PATTERNS VALUE PATTERN VALUES ...)"
   (declare (debug (&rest [pcase-PAT form])))
@@ -348,13 +349,14 @@ When a PATTERN doesn't match it's VALUE, the pair is silently skipped.
    (t
     (pcase-compile-patterns
      val
-     (list (cons pat
-                 (lambda (varvals &rest _)
-                   `(setq ,@(mapcan (lambda (varval)
-                                      (let ((var (car varval))
-                                            (val (cadr varval)))
-                                        (list var val)))
-                                    varvals)))))))))
+     `((,pat
+        . ,(lambda (varvals &rest _)
+             `(setq ,@(mapcan (lambda (varval)
+                                (let ((var (car varval))
+                                      (val (cadr varval)))
+                                  (list var val)))
+                              varvals))))
+       (pcase--dontcare . ignore))))))
 
 (defun pcase--trivial-upat-p (upat)
   (and (symbolp upat) (not (memq upat pcase--dontcare-upats))))
index 67882d00d8614e09f58c51f3eb2469815663e4b9..7ad01e7aef71f4351a1272d9d8a1eaae2ffd7a27 100644 (file)
   (should-error (pcase 1
                   ((cl-type notatype) 'integer))))
 
-(ert-deftest pcase-setq ()
-  (should (equal (let (a b)
-                   (pcase-setq `(,a ,b) nil)
-                   (list a b))
-                 (list nil nil)))
-
+(ert-deftest pcase-tests-setq ()
   (should (equal (let (a b)
                    (pcase-setq `((,a) (,b)) '((1) (2)))
                    (list a b))
                  (list 1 2)))
 
-  (should (equal (list 'unset 'unset)
+  (should (equal (list nil nil)
                  (let ((a 'unset)
                        (b 'unset))
-                   (pcase-setq `(,a ,b) nil)
+                   (pcase-setq `(head ,a ,b) nil)
                    (list a b))))
 
   (should (equal (let (a b)
                    (list a b))
                  '(1 2)))
 
+  (should-error (let (a b)
+                  (pcase-setq `[,a ,b] nil)
+                  (list a b)))
+
   (should (equal (let (a b)
                    (pcase-setq a 1 b 2)
                    (list a b))