From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Alan Mackenzie Newsgroups: gmane.emacs.devel Subject: Re: Code for cond* - cond*-match, cond*-subpat and backtrack-aliases Date: Thu, 25 Jan 2024 14:01:47 +0000 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="10852"; mail-complaints-to="usenet@ciao.gmane.io" Cc: emacs-devel@gnu.org To: Richard Stallman Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Thu Jan 25 15:02:50 2024 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1rT0Jd-0002bc-B9 for ged-emacs-devel@m.gmane-mx.org; Thu, 25 Jan 2024 15:02:49 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rT0Iu-0003ei-Ul; Thu, 25 Jan 2024 09:02:05 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rT0It-0003eY-4z for emacs-devel@gnu.org; Thu, 25 Jan 2024 09:02:03 -0500 Original-Received: from mail.muc.de ([193.149.48.3]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rT0Iq-0008Bf-OU for emacs-devel@gnu.org; Thu, 25 Jan 2024 09:02:02 -0500 Original-Received: (qmail 54717 invoked by uid 3782); 25 Jan 2024 15:01:48 +0100 Original-Received: from acm.muc.de (p4fe15d95.dip0.t-ipconnect.de [79.225.93.149]) (using STARTTLS) by colin.muc.de (tmda-ofmipd) with ESMTP; Thu, 25 Jan 2024 15:01:47 +0100 Original-Received: (qmail 8023 invoked by uid 1000); 25 Jan 2024 14:01:47 -0000 Content-Disposition: inline In-Reply-To: X-Submission-Agent: TMDA/1.3.x (Ph3nix) X-Primary-Address: acm@muc.de Received-SPF: pass client-ip=193.149.48.3; envelope-from=acm@muc.de; helo=mail.muc.de X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 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-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:315357 Archived-At: Hello again, Richard. On Wed, Jan 24, 2024 at 12:39:54 +0000, Alan Mackenzie wrote: > On Wed, Jan 17, 2024 at 22:37:47 -0500, Richard Stallman wrote: > > [[[ To any NSA and FBI agents reading my email: please consider ]]] > > [[[ whether defending the US Constitution against all enemies, ]]] > > [[[ foreign or domestic, requires you to follow Snowden's example. ]]] > > Here is the first draft of cond*. I have tested some cases > > but I ask others to help in testing it more thoroughly. > > I invite constructive comments, bug reports, patches, > > and suggestions. I've found some more things I'm not happy about in the code. 1/- There are typos in the doc string of cond*-subpat. 2/- There are three places where backtrack-aliases is used where I think it should be (cdr backtrack-aliases). 3/- In cond*-subpat, there are bindings for (gensym "ba") which seem unable to be referenced by anything. I think I'm missing something here. As I said yesterday, I'd be happier if gensyms could be avoided. I don't know if this is possible or practicable. 4/- There are several place where "\\>" is appended to a regexp. Would "\\_>" ("end of symbol"), which we've had in Emacs for 10 or 15 years now, perhaps be better? I've included a patch for the first two of these things below. There are other typos in the code, too, and I think it highly unlikely that it is bug free, yet. For cond* to be successful, it will need an extensive test file. Possibly we could copy the pcase test file (at test/lisp/emacs-lisp/pcase-tests.el) and adapt it to cond*. [ .... ] --- stallman.20240119.el 2024-01-25 13:31:15.049200457 +0000 +++ stallman.20240125.el 2024-01-25 13:36:44.454224261 +0000 @@ -200,7 +200,7 @@ ;; Run TRUE-EXPS if match succeeded. Bind our bindings around it. (setq expression `(if ,expression - ,(if (not (and backtrack-aliases (null uncondit-clauses))) + ,(if (not (and (cdr backtrack-aliases) (null uncondit-clauses))) ;; Bind these here if there are no UNCONDIT-CLAUSES. `(let ,(mapcar 'cdr (cdr backtrack-aliases)) (let* ,(car raw-result) @@ -219,7 +219,7 @@ (let* ,(car raw-result) ,(cond*-convert uncondit-clauses))))) ;; If there are backtrack aliases, bind them around the UNCONDIT-CLAUSES. - (if (and backtrack-aliases uncondit-clauses) + (if (and (cdr backtrack-aliases) uncondit-clauses) (setq expression `(let ,(mapcar 'cdr (cdr backtrack-aliases)) ,expression))) ;; If we used a gensym, add code to bind it. @@ -254,16 +254,16 @@ ;;; ??? Probably should optimize the `nth' calls in handling `list'. (defun cond*-subpat (subpat cdr-safe bindings backtrack-aliases data) - "Generate code to match ibe subpattern within `match*'. + "Generate code to match the subpattern within `match*'. SUBPAT is the subpattern to handle. CDR-SAFE if true means don't verify there are no extra elts in a list. BINDINGS is the list of bindings made by the containing and previous subpatterns of this pattern. Each element of BINDINGS must have the frm (VAR VALUE). -BACKTRACK-ALIASES is used to pass adta uward. Initial call should +BACKTRACK-ALIASES is used to pass data upward. Initial call should pass (list). The cdr of this collects backtracking aliases made for variables boung within (or...) patterns so that the caller -dna bind them etc. +can bind them etc. DATA is the expression for the data that this subpattern is supposed to match against. @@ -290,7 +290,7 @@ ;; for backtracking, just use that. (let ((this-alias (assq subpat (cdr backtrack-aliases)))) (if this-alias (cdr this-alias) - (if backtrack-aliases + (if (cdr backtrack-aliases) ;; Inside or subpattern but this symbol has no alias, ;; make one for it. (progn (setcdr backtrack-aliases (cons (cons subpat (gensym "ba")) > > -- > > Dr Richard Stallman (https://stallman.org) > > Chief GNUisance of the GNU Project (https://gnu.org) > > Founder, Free Software Foundation (https://fsf.org) > > Internet Hall-of-Famer (https://internethalloffame.org) -- Alan Mackenzie (Nuremberg, Germany).