[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master b552fc0: Allow zero-argument rx `or' and `seq' form
From: |
Mattias Engdegård |
Subject: |
[Emacs-diffs] master b552fc0: Allow zero-argument rx `or' and `seq' forms |
Date: |
Mon, 20 May 2019 05:43:16 -0400 (EDT) |
branch: master
commit b552fc05c231ca6800330a318d3a74ddd0f5a13c
Author: Mattias Engdegård <address@hidden>
Commit: Mattias Engdegård <address@hidden>
Allow zero-argument rx `or' and `seq' forms
Make the rx `or' and `seq' forms accept zero arguments to produce a
never-matching regexp and an empty string, respectively.
* lisp/emacs-lisp/rx.el (rx-constituents, rx-or): Permit zero args.
(rx): Amend doc string for `or' and `seq'.
* test/lisp/emacs-lisp/rx-tests.el (rx-or, rx-seq): Test the change.
* etc/NEWS (Changes in Specialized Modes and Packages): Mention the change.
---
etc/NEWS | 6 ++++++
lisp/emacs-lisp/rx.el | 13 ++++++++-----
test/lisp/emacs-lisp/rx-tests.el | 8 +++++++-
3 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/etc/NEWS b/etc/NEWS
index 9ca98c3..72702a9 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1321,6 +1321,12 @@ when given in a string. Previously, '(any "\x80-\xff")'
would match
characters U+0080...U+00FF. Now the expression matches raw bytes in
the 128...255 range, as expected.
+*** The rx 'or' and 'seq' forms no longer require any arguments.
+(or) produces a regexp that never matches anything, while (seq)
+matches the empty string, each being an identity for the operation.
+This also works for their aliases: '|' for 'or'; ':', 'and' and
+'sequence' for 'seq'.
+
** Frames
+++
diff --git a/lisp/emacs-lisp/rx.el b/lisp/emacs-lisp/rx.el
index 9d9028d..9478bd3 100644
--- a/lisp/emacs-lisp/rx.el
+++ b/lisp/emacs-lisp/rx.el
@@ -110,11 +110,11 @@
;; FIXME: support macros.
(defvar rx-constituents ;Not `const' because some modes extend it.
- '((and . (rx-and 1 nil))
+ '((and . (rx-and 0 nil))
(seq . and) ; SRE
(: . and) ; SRE
(sequence . and) ; sregex
- (or . (rx-or 1 nil))
+ (or . (rx-or 0 nil))
(| . or) ; SRE
(not-newline . ".")
(nonl . not-newline) ; SRE
@@ -390,9 +390,11 @@ FORM is of the form `(and FORM1 ...)'."
"Parse and produce code from FORM, which is `(or FORM1 ...)'."
(rx-check form)
(rx-group-if
- (if (memq nil (mapcar 'stringp (cdr form)))
- (mapconcat (lambda (x) (rx-form x '|)) (cdr form) "\\|")
+ (cond
+ ((null (cdr form)) regexp-unmatchable)
+ ((cl-every #'stringp (cdr form))
(regexp-opt (cdr form) nil t))
+ (t (mapconcat (lambda (x) (rx-form x '|)) (cdr form) "\\|")))
(and (memq rx-parent '(: * t)) rx-parent)))
@@ -1121,6 +1123,7 @@ CHAR
`(seq SEXP1 SEXP2 ...)'
`(sequence SEXP1 SEXP2 ...)'
matches what SEXP1 matches, followed by what SEXP2 matches, etc.
+ Without arguments, matches the empty string.
`(submatch SEXP1 SEXP2 ...)'
`(group SEXP1 SEXP2 ...)'
@@ -1136,7 +1139,7 @@ CHAR
`(| SEXP1 SEXP2 ...)'
matches anything that matches SEXP1 or SEXP2, etc. If all
args are strings, use `regexp-opt' to optimize the resulting
- regular expression.
+ regular expression. Without arguments, never matches anything.
`(minimal-match SEXP)'
produce a non-greedy regexp for SEXP. Normally, regexps matching
diff --git a/test/lisp/emacs-lisp/rx-tests.el b/test/lisp/emacs-lisp/rx-tests.el
index 4a5919e..6f392d6 100644
--- a/test/lisp/emacs-lisp/rx-tests.el
+++ b/test/lisp/emacs-lisp/rx-tests.el
@@ -107,7 +107,13 @@
"ab"))
(should (equal (and (string-match (rx (or "a" "ab" "abc")) s)
(match-string 0 s))
- "a"))))
+ "a")))
+ ;; Test zero-argument `or'.
+ (should (equal (rx (or)) regexp-unmatchable)))
+
+(ert-deftest rx-seq ()
+ ;; Test zero-argument `seq'.
+ (should (equal (rx (seq)) "")))
(provide 'rx-tests)
;; rx-tests.el ends here.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] master b552fc0: Allow zero-argument rx `or' and `seq' forms,
Mattias Engdegård <=