emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 96d83a8: * lisp/emacs-lisp/pcase.el (pcase-setq): Align its seman


From: Stefan Monnier
Subject: master 96d83a8: * lisp/emacs-lisp/pcase.el (pcase-setq): Align its semantics with `pcase-let`
Date: Thu, 12 Aug 2021 11:04:41 -0400 (EDT)

branch: master
commit 96d83a854673797952e678796e2165c187a24f54
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>

    * lisp/emacs-lisp/pcase.el (pcase-setq): Align its semantics with 
`pcase-let`
    
    * test/lisp/emacs-lisp/pcase-tests.el (pcase-tests-setq): Rename from
    pcase-setq and ajust accordingly.
---
 lisp/emacs-lisp/pcase.el            | 18 ++++++++++--------
 test/lisp/emacs-lisp/pcase-tests.el | 15 +++++++--------
 2 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el
index d111d9e..63b187b 100644
--- a/lisp/emacs-lisp/pcase.el
+++ b/lisp/emacs-lisp/pcase.el
@@ -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))))
diff --git a/test/lisp/emacs-lisp/pcase-tests.el 
b/test/lisp/emacs-lisp/pcase-tests.el
index 67882d0..7ad01e7 100644
--- a/test/lisp/emacs-lisp/pcase-tests.el
+++ b/test/lisp/emacs-lisp/pcase-tests.el
@@ -110,21 +110,16 @@
   (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)
@@ -132,6 +127,10 @@
                    (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))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]