From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Okam Newsgroups: gmane.emacs.help Subject: Re: How to extract bindings from `pcase-let*`? Date: Tue, 16 Mar 2021 01:50:32 +0000 Message-ID: <3217e2b9-1b58-1984-ba0a-4526e76cfb4d@protonmail.com> References: <319f8b2c-7ffc-9a26-0b7b-fe488036c77e@protonmail.com> Reply-To: Okam 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="4220"; mail-complaints-to="usenet@ciao.gmane.io" To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Tue Mar 16 02:51:10 2021 Return-path: Envelope-to: geh-help-gnu-emacs@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 1lLyrW-00010C-5Y for geh-help-gnu-emacs@m.gmane-mx.org; Tue, 16 Mar 2021 02:51:10 +0100 Original-Received: from localhost ([::1]:59566 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lLyrV-0004u3-5Y for geh-help-gnu-emacs@m.gmane-mx.org; Mon, 15 Mar 2021 21:51:09 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:59652) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lLyrA-0004ts-SV for help-gnu-emacs@gnu.org; Mon, 15 Mar 2021 21:50:48 -0400 Original-Received: from mail-40131.protonmail.ch ([185.70.40.131]:63479) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lLyr8-0007JG-Fw for help-gnu-emacs@gnu.org; Mon, 15 Mar 2021 21:50:48 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=protonmail; t=1615859435; bh=izhg4mb8KCzD3/XnGehDx+arbAwgRDAOP+unVmf93Zw=; h=Date:To:From:Reply-To:Subject:In-Reply-To:References:From; b=hVZR7j42tr/qe7nhaao46y7D15sqqiRrCtV3TJhbXeFaCh/tsWGnxzFhmc5dtaokR PRuZSb3K53XWmBDSydJvYxOtxoPyw0ToagC/DObiWFZ86EKcUmzvX39usOgqsJsbzZ OdeLEM7UPEmV8wiYL1QzlhZQe4s6gg5URxtM4cEw= In-Reply-To: Received-SPF: pass client-ip=185.70.40.131; envelope-from=okamsn@protonmail.com; helo=mail-40131.protonmail.ch X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "help-gnu-emacs" Xref: news.gmane.io gmane.emacs.help:128420 Archived-At: On 3/15/21 11:38 AM, Stefan Monnier wrote: > >> I would like to extract the bindings created by `pcase-let*` to use them >> in a `setq` form. Is there a good way of doing this? > > Sending me a patch to `pcase.el` which does that? OK. I wanted to see if there was an intentional entry point first. >> Previously, I was using `macroexpand` on `pcase-let*` and extracting the >> bindings from the list, but after the expansion produced by `pcase-let*` >> changed recently, I realized that this way assumes too much. > > Interesting. Can you show me the code you used? This is the simple code I used: (defun loopy-pcase--get-variable-values (var val) "Destructure VAL according to VAR using `pcase'. Return a list of 2 sub-lists: (1) the needed generated variables and (2) the variables actually named in VAR. VAR should be a normal `pcase' destructuring pattern, such as \"`(a . ,b)\" or \"`(1 2 3 . ,rest)\"." ;; Using `pcase-let*' as an interface, since it is a public function= . ;; `pcase' knows to not assign variables if they are unused, so we pass ;; back in `var' (a backquoted list) so that it thinks the variables ;; are used. ;; ;; This will give a form like ;; (let* (temp-vars) (let (actual-vars) VAR)) ;; ;; NOTE: Named variables might be in reverse order. Not sure if this is ;; reliable behavior. (pcase-let* ((`(let* ,temp-vars (let ,true-vars . ,_)) (macroexpand `(pcase-let* ((,var ,val)) ,var)))) (list temp-vars true-vars))) It assumes too much, and is not resilient to changes in how `pcase-let*` expands. I don't fully understand the code of Pcase yet, and failed to find something like Dash's `dash--match`, which returns a list of bindings that can be substituted into forms like `setq` or `let*`. I am doing this to attempt to optionally use Pcase for destructuring in a macro that I am writing.