From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Eric Abrahamsen Newsgroups: gmane.emacs.devel Subject: Re: rx.el sexp regexp syntax Date: Sun, 03 Jun 2018 09:40:35 -0700 Message-ID: <87d0x76cxo.fsf@ericabrahamsen.net> References: <87h8mw3yoc.fsf@gmail.com> <20180525155126.GA4096@ACM> <87lgc7hebk.fsf@gmail.com> <87r2lzd375.fsf@ericabrahamsen.net> <87lgbx2dc1.fsf@ericabrahamsen.net> <87in6z6gwa.fsf@ericabrahamsen.net> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: blaine.gmane.org 1528044100 31734 195.159.176.226 (3 Jun 2018 16:41:40 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sun, 3 Jun 2018 16:41:40 +0000 (UTC) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sun Jun 03 18:41:36 2018 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fPW4W-0008AJ-6U for ged-emacs-devel@m.gmane.org; Sun, 03 Jun 2018 18:41:36 +0200 Original-Received: from localhost ([::1]:35941 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fPW6d-0000ea-EF for ged-emacs-devel@m.gmane.org; Sun, 03 Jun 2018 12:43:47 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:45249) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fPW6X-0000eT-En for emacs-devel@gnu.org; Sun, 03 Jun 2018 12:43:42 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fPW6U-0001KM-B2 for emacs-devel@gnu.org; Sun, 03 Jun 2018 12:43:41 -0400 Original-Received: from [195.159.176.226] (port=49548 helo=blaine.gmane.org) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fPW6U-0001G5-45 for emacs-devel@gnu.org; Sun, 03 Jun 2018 12:43:38 -0400 Original-Received: from list by blaine.gmane.org with local (Exim 4.84_2) (envelope-from ) id 1fPW4K-0007xs-Ol for emacs-devel@gnu.org; Sun, 03 Jun 2018 18:41:24 +0200 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 45 Original-X-Complaints-To: usenet@blaine.gmane.org Cancel-Lock: sha1:i6Y2BRpn1fXqvXC1hQ3VNwv7fIc= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 195.159.176.226 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:225966 Archived-At: Helmut Eller writes: > On Sun, Jun 03 2018, Eric Abrahamsen wrote: > >>> Maybe we could start with an ordinary macro, e.g. (pcre "(a|b)"), which >>> could translate Perl/Python regexp syntax to Emacs regexp syntax. >> >> I made something like that, but the only advantage is your example >> above: open and close parentheses, and the vertical bar. Everything else >> still has to be double-backslashed. It feels inconsistent, and isn't >> that much of a benefit... > > Any benefit on a small example is bound to be small. And yes, in > practice most regexps fit on a single line. i.e. they are small. > > I'm not sure what you mean with "everything else" as in this example > there's nothing else. The example would translate to: "\\(a\\|\\b\\)" > which, while it is one character shorter, is also quite ugly. > > Maybe you mean that things like \w cannot occur in ordinary strings > without double-backslash. Hmm.. that's indeed a problem. Yes, that's what I meant: all the other backslash constructions. If we still have to write "(atl|choo)\\1", it doesn't feel consistent, and I think doesn't save much mental overhead. #+BEGIN_SRC elisp (defmacro pcre (str) (with-temp-buffer (insert str) (goto-char (point-min)) (while (< (point) (point-max)) (cond ((looking-at "\\\\\\([(|)]\\)") ;; Remove double backslashes. (replace-match "\\1")) ((looking-at "\\([(|)]\\)") (replace-match "\\\\\\1")) ;; Add parsing of comments and elisp forms here. (t (forward-char)))) (buffer-string))) #+END_SRC I would do: (defalias 'r 'pcre)