Function: rx--pcase-transform
rx--pcase-transform is a byte-compiled function defined in rx.el.gz.
Signature
(rx--pcase-transform RX)
Documentation
Transform RX, an rx-expression augmented with let and named backref,
into a plain rx-expression, collecting names into rx--pcase-vars.
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/rx.el.gz
;; FIXME: The rewriting strategy for pcase works so-so with extensions;
;; definitions cannot expand to `let' or named `backref'. If this ever
;; becomes a problem, we can handle those forms in the ordinary parser,
;; using a dynamic variable for activating the augmented forms.
(defun rx--pcase-transform (rx)
"Transform RX, an rx-expression augmented with `let' and named `backref',
into a plain rx-expression, collecting names into `rx--pcase-vars'."
(pcase rx
(`(let ,name . ,body)
(let* ((index (length (memq name rx--pcase-vars)))
(i (if (zerop index)
(length (push name rx--pcase-vars))
index)))
`(group-n ,i ,(rx--pcase-transform (cons 'seq body)))))
((and `(backref ,ref)
(guard (symbolp ref)))
(let ((index (length (memq ref rx--pcase-vars))))
(when (zerop index)
(error "rx `backref' variable must be one of: %s"
(mapconcat #'symbol-name rx--pcase-vars " ")))
`(backref ,index)))
((and `(,head . ,rest)
(guard (and (or (symbolp head) (memq head '(?\s ??)))
(not (memq head '(literal regexp regex eval))))))
(cons head (mapcar #'rx--pcase-transform rest)))
(_ rx)))