From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Ihor Radchenko Newsgroups: gmane.emacs.devel Subject: Re: pcase bindings in patterns with complicated logic Date: Sat, 13 Jan 2024 19:58:07 +0000 Message-ID: <87il3xt38w.fsf@localhost> References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="13950"; mail-complaints-to="usenet@ciao.gmane.io" Cc: emacs-devel@gnu.org To: rms@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sat Jan 13 20:55:49 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 1rOk6e-0003TB-Ro for ged-emacs-devel@m.gmane-mx.org; Sat, 13 Jan 2024 20:55:48 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rOk5t-0007M9-9t; Sat, 13 Jan 2024 14:55:01 -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 1rOk5p-0007Ip-Nk for emacs-devel@gnu.org; Sat, 13 Jan 2024 14:54:58 -0500 Original-Received: from mout02.posteo.de ([185.67.36.66]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rOk5n-0004L9-Mh for emacs-devel@gnu.org; Sat, 13 Jan 2024 14:54:57 -0500 Original-Received: from submission (posteo.de [185.67.36.169]) by mout02.posteo.de (Postfix) with ESMTPS id A44EA240101 for ; Sat, 13 Jan 2024 20:54:53 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.net; s=2017; t=1705175693; bh=nSlmamSvOqA2hgInerg59Bejdk7Lm9JsmrEpJAqhZOY=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version: Content-Transfer-Encoding:From; b=G94vnkII4SCNNUdu0A7ysxM53qx5HKJMVTetxSaJTznND+LKCW0dbkIhzllEnjbOO fMUOqJwHOxdHlgiSpu3hQRjPBslin83oLh2CWTE3rPjIJmk+uSZnqsmbEMouSAJZnQ eC6ZoLGGJ0OwkFN/U1Wuin36xjoNGN+wKJ08zTNNOVrOj4AmO9pyD3yMke+EkynUXY UEDekw03vLaApYR431em7Ior8ujsYQXTSuGSUrIInHj/eRPnLLpLFnTD5sy/OhVw0e 7iGYWLD0BBFn0wy5L9NBo9o0JeSv3q2usD+uk2shhxmWu7gaKkA2Sljp9CGwVmVzEm 1og64yzzs69Jw== Original-Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4TC8JF294dz6twm; Sat, 13 Jan 2024 20:54:53 +0100 (CET) In-Reply-To: Received-SPF: pass client-ip=185.67.36.66; envelope-from=yantar92@posteo.net; helo=mout02.posteo.de X-Spam_score_int: -43 X-Spam_score: -4.4 X-Spam_bar: ---- X-Spam_report: (-4.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=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:314938 Archived-At: Richard Stallman writes: > (pcase '(foo 5) > ((or `(,(and (pred symbolp) a1) ,(and (pred symbolp) b1)) > `(,(and (pred symbolp) a2) ,(and (pred numberp) b2))) > `(,a1 ,b1 ,a2 ,b2))) > > =3D> (nil nil foo 5) > > That surrised me, since outside the pcase, all four variables > are unbound and referring to them gets errors. > > So it seems that all the pattern variables in the curren clause are > bound somehow if that clause succeeds, but only some of them get > significant values. > > Is that an accurate general statement of how pcase handles binding > pattern variables? This looks like a bug. The manual has a dedicated paragraph explaining the above scenario. However, on the latest Emacs master, "void variable" errors are not thrown, in contradiction with what the manual states. 3. On match, the clause's body forms can reference the set of symbols the pattern let-binds. When SEQPAT is =E2=80=98and=E2=80=99, this set= is the union of all the symbols each of its sub-patterns let-binds. This makes sense because, for =E2=80=98and=E2=80=99 to match, all the sub-pattern= s must match. When SEQPAT is =E2=80=98or=E2=80=99, things are different: =E2=80=98or= =E2=80=99 matches at the first sub-pattern that matches; the rest of the sub-patterns are ignored. It makes no sense for each sub-pattern to let-bind a different set of symbols because the body forms have no way to distinguish which sub-pattern matched and choose among the different sets. For example, the following is invalid: (require 'cl-lib) (pcase (read-number "Enter an integer: ") ((or (and (pred cl-evenp) e-num) ; bind =E2=80=98e-num=E2=80=99 to EXPVAL o-num) ; bind =E2=80=98o-num=E2=80=99 to EXPVAL (list e-num o-num))) Enter an integer: 42 error=E2=86=92 Symbol=E2=80=99s value as variable is void: o-num Enter an integer: 149 error=E2=86=92 Symbol=E2=80=99s value as variable is void: e-num --=20 Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at . Support Org development at , or support my work at