Function: rx--translate-not
rx--translate-not is a byte-compiled function defined in rx.el.gz.
Signature
(rx--translate-not NEGATED BODY)
Documentation
Translate a (not ...) construct. Return (REGEXP . PRECEDENCE).
If NEGATED, negate the sense (thus making it positive).
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/rx.el.gz
;; FIXME: Consider turning `not' into a variadic operator, following SRE:
;; (not A B) = (not (or A B)) = (intersection (not A) (not B)), and
;; (not) = anychar.
;; Maybe allow singleton characters as arguments.
(defun rx--translate-not (negated body)
"Translate a (not ...) construct. Return (REGEXP . PRECEDENCE).
If NEGATED, negate the sense (thus making it positive)."
(unless (and body (null (cdr body)))
(error "rx `not' form takes exactly one argument"))
(let ((arg (car body)))
(cond
((and (consp arg)
(pcase (car arg)
((or 'any 'in 'char)
(rx--translate-any (not negated) (cdr arg)))
('syntax
(rx--translate-syntax (not negated) (cdr arg)))
('category
(rx--translate-category (not negated) (cdr arg)))
('not
(rx--translate-not (not negated) (cdr arg)))
((or 'or '|)
(rx--translate-union (not negated) (cdr arg)))
('intersection
(rx--translate-intersection (not negated) (cdr arg))))))
((let ((class (cdr (assq arg rx--char-classes))))
(and class
(rx--generate-alt (not negated) nil (list class)))))
((eq arg 'word-boundary)
(rx--translate-symbol
(if negated 'word-boundary 'not-word-boundary)))
((characterp arg)
(rx--generate-alt (not negated) (list (cons arg arg)) nil))
((and (stringp arg) (= (length arg) 1))
(let ((char (string-to-char arg)))
(rx--generate-alt (not negated) (list (cons char char)) nil)))
((let ((expanded (rx--expand-def arg)))
(and expanded
(rx--translate-not negated (list expanded)))))
(t (error "Illegal argument to rx `not': %S" arg)))))