From: Mattias EngdegÄrd Date: Mon, 7 Oct 2019 16:28:18 +0000 (+0200) Subject: Add `unmatchable' as alias for (or) in rx (bug#37659) X-Git-Tag: emacs-27.0.90~1008 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=ae5407b8579feae17ab34ed9ac68149cc29387c9;p=emacs.git Add `unmatchable' as alias for (or) in rx (bug#37659) * lisp/emacs-lisp/rx.el (rx--translate-symbol, rx--builtin-symbols, rx): * test/lisp/emacs-lisp/rx-tests.el (rx-atoms): * doc/lispref/searching.texi (Rx Constructs): * etc/NEWS: Add `unmatchable', more descriptive than (or), and corresponding to the variable `regexp-unmatchable'. --- diff --git a/doc/lispref/searching.texi b/doc/lispref/searching.texi index 2274bab002c..a6c6bf2d4a0 100644 --- a/doc/lispref/searching.texi +++ b/doc/lispref/searching.texi @@ -1083,6 +1083,11 @@ Corresponding string regexp: @samp{@var{A}@var{B}@dots{}} Match exactly one of the @var{rx}s, trying from left to right. Without arguments, the expression will not match anything at all.@* Corresponding string regexp: @samp{@var{A}\|@var{B}\|@dots{}}. + +@item @code{unmatchable} +@cindex @code{unmatchable} in rx +Refuse any match. Equivalent to @code{(or)}. +@xref{regexp-unmatchable}. @end table @subsubheading Repetition @@ -1806,6 +1811,7 @@ list of characters @var{chars}. @c Internal functions: regexp-opt-group +@anchor{regexp-unmatchable} @defvar regexp-unmatchable This variable contains a regexp that is guaranteed not to match any string at all. It is particularly useful as default value for diff --git a/etc/NEWS b/etc/NEWS index 25c1cef9516..5794af5b601 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1844,6 +1844,7 @@ the 128...255 range, as expected. matches the empty string, each being an identity for the operation. This also works for their aliases: '|' for 'or'; ':', 'and' and 'sequence' for 'seq'. +The symbol 'unmatchable' can be used as an alternative to (or). --- *** 'regexp' and new 'literal' accept arbitrary lisp as arguments. diff --git a/lisp/emacs-lisp/rx.el b/lisp/emacs-lisp/rx.el index 6c0b2069302..cf02df239fe 100644 --- a/lisp/emacs-lisp/rx.el +++ b/lisp/emacs-lisp/rx.el @@ -126,7 +126,6 @@ Each entry is: (get name 'rx-definition))) ;; TODO: Additions to consider: -;; - A name for (or), maybe `unmatchable'. ;; - A construct like `or' but without the match order guarantee, ;; maybe `unordered-or'. Useful for composition or generation of ;; alternatives; permits more effective use of regexp-opt. @@ -138,6 +137,7 @@ Each entry is: ;; since the return value may be mutated. ((or 'nonl 'not-newline 'any) (cons (list ".") t)) ((or 'anychar 'anything) (rx--translate-form '(or nonl "\n"))) + ('unmatchable (rx--empty)) ((or 'bol 'line-start) (cons (list "^") 'lseq)) ((or 'eol 'line-end) (cons (list "$") 'rseq)) ((or 'bos 'string-start 'bot 'buffer-start) (cons (list "\\`") t)) @@ -912,7 +912,7 @@ can expand to any number of values." "List of built-in rx function-like symbols.") (defconst rx--builtin-symbols - (append '(nonl not-newline any anychar anything + (append '(nonl not-newline any anychar anything unmatchable bol eol line-start line-end bos eos string-start string-end bow eow word-start word-end @@ -1016,6 +1016,7 @@ CHAR Match a literal character. or a character class. not-newline Match any character except a newline. Alias: nonl. anychar Match any character. Alias: anything. +unmatchable Never match anything at all. CHARCLASS Match a character from a character class. One of: alpha, alphabetic, letter Alphabetic characters (defined by Unicode). diff --git a/test/lisp/emacs-lisp/rx-tests.el b/test/lisp/emacs-lisp/rx-tests.el index d4524e5a251..903b191c98e 100644 --- a/test/lisp/emacs-lisp/rx-tests.el +++ b/test/lisp/emacs-lisp/rx-tests.el @@ -186,6 +186,8 @@ (ert-deftest rx-atoms () (should (equal (rx anychar anything) "\\(?:.\\|\n\\)\\(?:.\\|\n\\)")) + (should (equal (rx unmatchable) + "\\`a\\`")) (should (equal (rx line-start not-newline nonl any line-end) "^...$")) (should (equal (rx bol string-start string-end buffer-start buffer-end