[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))
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 96d83a8: * lisp/emacs-lisp/pcase.el (pcase-setq): Align its semantics with `pcase-let`,
Stefan Monnier <=