From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.help Subject: Re: How to extract bindings from `pcase-let*`? Date: Mon, 15 Mar 2021 22:45:32 -0400 Message-ID: References: <319f8b2c-7ffc-9a26-0b7b-fe488036c77e@protonmail.com> <3217e2b9-1b58-1984-ba0a-4526e76cfb4d@protonmail.com> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="36875"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) To: help-gnu-emacs@gnu.org Cancel-Lock: sha1:2qS8AW31hunz6GIPKwK4xemcbno= Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Tue Mar 16 03:46:07 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 1lLzif-0009US-Ss for geh-help-gnu-emacs@m.gmane-mx.org; Tue, 16 Mar 2021 03:46:05 +0100 Original-Received: from localhost ([::1]:58570 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lLzie-0003NA-Up for geh-help-gnu-emacs@m.gmane-mx.org; Mon, 15 Mar 2021 22:46:04 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:42610) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lLziJ-0003N2-7Y for help-gnu-emacs@gnu.org; Mon, 15 Mar 2021 22:45:43 -0400 Original-Received: from ciao.gmane.io ([116.202.254.214]:60278) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lLziH-0008O2-Nb for help-gnu-emacs@gnu.org; Mon, 15 Mar 2021 22:45:42 -0400 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1lLziE-00091d-Ua for help-gnu-emacs@gnu.org; Tue, 16 Mar 2021 03:45:38 +0100 X-Injected-Via-Gmane: http://gmane.org/ Received-SPF: pass client-ip=116.202.254.214; envelope-from=geh-help-gnu-emacs@m.gmane-mx.org; helo=ciao.gmane.io X-Spam_score_int: -15 X-Spam_score: -1.6 X-Spam_bar: - X-Spam_report: (-1.6 / 5.0 requ) BAYES_00=-1.9, HEADER_FROM_DIFFERENT_DOMAINS=0.25, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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:128421 Archived-At: > (pcase-let* ((`(let* ,temp-vars (let ,true-vars . ,_)) > (macroexpand `(pcase-let* ((,var ,val)) ,var)))) > (list temp-vars true-vars))) Indeed it's not reliable: for a case like (pcase-let (((or `(inorder ,x ,y) `(reverse ,y ,x)) FOO)) (cons x y)) it will generate code comparable to (if (eq (car FOO) 'inorder) (cons (nth 1 FOO) (nth 2 FOO)) (cons (nth 2 FOO) (nth 1 FOO)) [ Just obfuscated with gensym'd vars and such ] And if you replace the trivial (cons x y) with something less trivial it will turn into something comparable to: (let ((body (lambda (x y) ))) (if (eq (car FOO) 'inorder) (funcall body (nth 1 FOO) (nth 2 FOO)) (funcall body (nth 2 FOO) (nth 1 FOO)))) so it's far from clear how to represent this kind of code in the form of "a list of bindings that can be substituted into forms like `setq` or `let*`" OTOH, I think `pcase.el` could offer a function which could take a "buildbody" function as argument, where that buildbody would receive something like the list (x y) and would be expected to return the (lambda (x y) ) to use. So you could pass it a "buildbody" function which takes the list (x y) and returns something like (lambda (tmp1 tmp2) (setq x tmp1 y tmp2)), which I expect would do more or less what you want. > I am doing this to attempt to optionally use Pcase for destructuring in > a macro that I am writing. `pcase-let` already does destructuring, so could you explain in a bit more detail what kind of destructuring you're looking for (and why)? Stefan