Function: pcase-setq

pcase-setq is an autoloaded macro defined in pcase.el.gz.

Signature

(pcase-setq PATTERN VALUE PATTERN VALUE ...)

Documentation

Assign values to variables by destructuring with pcase.

Each PATTERN is a normal pcase pattern, and each VALUE an expression.

Evaluation happens sequentially as in setq (not in parallel).

An example: (pcase-setq `((,a) [(,b)]) '((1) [(2)]))

Each VALUE is presumed to match its PATTERN. Failure to match may signal an error or go undetected, binding variables to arbitrary values, such as nil.

View in manual

Probably introduced at or before Emacs version 28.1.

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/pcase.el.gz
;;;###autoload
(defmacro pcase-setq (pat val &rest args)
  "Assign values to variables by destructuring with `pcase'.
Each PATTERN is a normal `pcase' pattern, and each VALUE an expression.

Evaluation happens sequentially as in `setq' (not in parallel).

An example: (pcase-setq \\=`((,a) [(,b)]) \\='((1) [(2)]))

Each VALUE is presumed to match its PATTERN.  Failure to match may
signal an error or go undetected, binding variables to arbitrary values,
such as nil.

\(fn PATTERN VALUE PATTERN VALUE ...)"
  (declare (debug (&rest [pcase-PAT form])))
  (cond
   (args
    (let ((arg-length (length args)))
      (unless (evenp arg-length)
        (signal 'wrong-number-of-arguments
                (list 'pcase-setq (+ 2 arg-length)))))
    (let ((result))
      (while args
        (push `(pcase-setq ,(pop args) ,(pop args))
              result))
      `(progn
         (pcase-setq ,pat ,val)
         ,@(nreverse result))))
   ((pcase--trivial-upat-p pat)
    `(setq ,pat ,val))
   (t
    (pcase-compile-patterns
     val
     `((,pat
        . ,(lambda (varvals &rest _)
             `(setq ,@(mapcan (lambda (varval)
                                (let ((var (car varval))
                                      (val (cadr varval)))
                                  (list var val)))
                              varvals))))
       (pcase--dontcare . ignore))))))