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])))
(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))))
(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))