From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Michael Heerdegen Newsgroups: gmane.emacs.devel Subject: Re: pcase-if-let? Date: Thu, 29 Mar 2018 05:46:49 +0200 Message-ID: <87605filw6.fsf@web.de> References: <871sg3eqi5.fsf@web.de> <0e8139b0-b59c-1d7e-29db-66170858f8ca@lanl.gov> <87woxvd947.fsf@web.de> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: blaine.gmane.org 1522295106 30014 195.159.176.226 (29 Mar 2018 03:45:06 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Thu, 29 Mar 2018 03:45:06 +0000 (UTC) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux) Cc: Emacs Development To: Davis Herring Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Mar 29 05:45:02 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 1f1OUm-0007ge-Gx for ged-emacs-devel@m.gmane.org; Thu, 29 Mar 2018 05:45:00 +0200 Original-Received: from localhost ([::1]:42023 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f1OWp-0001Ok-Te for ged-emacs-devel@m.gmane.org; Wed, 28 Mar 2018 23:47:07 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:56157) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f1OWj-0001Nv-Ew for emacs-devel@gnu.org; Wed, 28 Mar 2018 23:47:02 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f1OWf-0002r8-J3 for emacs-devel@gnu.org; Wed, 28 Mar 2018 23:47:01 -0400 Original-Received: from mout.web.de ([212.227.15.4]:60519) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1f1OWf-0002qu-9C for emacs-devel@gnu.org; Wed, 28 Mar 2018 23:46:57 -0400 Original-Received: from drachen.dragon ([88.75.99.135]) by smtp.web.de (mrweb001 [213.165.67.108]) with ESMTPSA (Nemesis) id 0LpwMZ-1eNgKK0oBb-00fg2P; Thu, 29 Mar 2018 05:46:51 +0200 In-Reply-To: <87woxvd947.fsf@web.de> (Michael Heerdegen's message of "Thu, 29 Mar 2018 02:21:44 +0200") X-Provags-ID: V03:K0:UaTEABNzG4Swy4nhkZtj9pb4vO+sf+NoViu9LZxW2pnRzZqTQFd ipy27C5DmsfjISIFkrZhWKSVGhARKpyMk3TL3AmDTAQFhpMzIW5oLNvCvUobzLhd5VgKv1a L1ojMENHlR5fT14QY2adDAGruJbbJy4m3Ejy0jt1+geC7vvGwvKqVpt2BLvf/oT1clYe4ga wuGhtnD4YkXmwkwqyDL2A== X-UI-Out-Filterresults: notjunk:1;V01:K0:8wAhfObK5C0=:R/0r5GORDlsACqfCsIjtPO VEKwNlvr2PhSRzOSp8GqkAncQjh+h/DhtfJIUlJx8jFweandH14veXEDpOdhUQBkcctbrE9IM B8lHKJz0IHVc7K/jPdY/UAHwNzch19HLA8yJWdPsFjRlghFQuCZB54VlVR4lRCY5YJc15yVJj wxYCvEVdv67w54722upDeh/spyS+MEocMMiP90cXCGav4igWB3ne9w1r3LCjkm0+HB/1Lm0HL tN9pG8+UVdjyBm7u1sokXXhvTFFCNpJ/IenggZSB7GEJHrn/KGnTpesXB8YWue6gPKKOKNwVn PqgkAoWmPlPvSFpYKlQRrlOfeDX6QULgL4iR1MFQ52/ncT37JGYHTJfdxlIPuBpcrcZtxAXSl roONIHSnZBBMypMRE1oqZjBNg80/Me0SBMoco4fH5wTbpB/04f7RvqtNb4WCYXJq4ysH7bylW 8JiFJ9StyoEYa3gzGKL/hBxUpfLVJiVIOEUM96JGwRc/g9cIsYE/ka4mtHdREe7yLsT09xkEo NbrZiuTFsx+myMwwtxKApY8TfOmmafJRr/FWGYO/n1VUu9KhvPZYuA+QuZjUWAU7U6mGdSjxZ TK9MZHIL1DX10LAhcU6AeT9vDBVcYMxsORheEoHagW2JolSWj7+w8K3jvAgY7H2PBIoMeuFfT BiJPTQhBk0mc9vuPn1sMP7L+DggaVNSGYw4XC/PCNPuJ4tsI5cBszAu2UV5K3Om8iojOgC2dr 8QLLsIUc7MyuMH0EGVWg9yph/a/lPITdJeKOg3o86djQlLc+C0EnvGib5n97cXG0OaQ8NJO4 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.15.4 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:224133 Archived-At: Michael Heerdegen writes: > Doesn't the empty `let*' create a new lexical environment? Hmm, no, we thought that it should, but I think it doesn't, so I've removed that `let*' wrapper for now. And fixed some embarrassing mistakes. New version (named `pcase-if' this time): #+begin_src emacs-lisp (defmacro pcase-if (clauses then-form &rest else-forms) "Eval THEN-FORM or the ELSE-FORMS depending on CLAUSES. CLAUSES is a list of the form \((PATTERN VALUE-FORM) ...) Successively try to match every `pcase' PATTERN against its VALUE-FORM. When all match, eval THEN-FORM, else the ELSE-FORMS." (declare (indent 2) (debug ((&rest (pcase-PAT &optional form)) form body))) (if (null clauses) then-form (let ((success-syms '()) (last-success-sym nil)) (dotimes (i (length clauses)) (push (make-symbol (format "matching-%d-success" i)) success-syms)) (cl-callf nreverse success-syms) `(let ,(mapcar (lambda (s) `(,s nil)) success-syms) (pcase nil ((and ,@(mapcar (pcase-lambda (`(,pattern ,value)) `(let (and ,@(and last-success-sym `((guard ,last-success-sym))) ,pattern (let ,(setq last-success-sym (pop success-syms)) t)) ,value)) clauses)) (if ,last-success-sym ,then-form ,@else-forms))))))) #+end_src (The constructed pcase form is a bit unorthodox, but it was the simplest thing that occurred to me.) Michael.