From: Adam Porter <adam@alphapapa.net>
To: rms@gnu.org
Cc: emacs-devel@gnu.org
Subject: Re: cond*
Date: Sun, 17 Dec 2023 23:41:22 -0600 [thread overview]
Message-ID: <a0ba6c11-a0df-46e3-a60e-901469f391f8@alphapapa.net> (raw)
In-Reply-To: <E1rF4wk-0006QG-G6@fencepost.gnu.org>
> To finish the design of cond*, we need to find what features
> needed to be added so that it is rare to encounter a pcase
> that can't be replaced cleanly. Would people please tell me
> about possible examples?
Well, one of the most common things I do with pcase is to destructure
alists, plists, and structs, often nested at multiple levels. For example:
(defun ement-ignore-user (user-id session &optional unignore-p)
"Ignore USER-ID on SESSION.
If UNIGNORE-P (interactively, with prefix), un-ignore USER."
(interactive (list (ement-complete-user-id)
(ement-complete-session)
current-prefix-arg))
;; NOTE: Destructures account-data slot of ement-session struct.
(pcase-let* (((cl-struct ement-session account-data) session)
;; NOTE: Destructures alist nested in another alist and
;; binds to a variable of a different name than the key.
((map ('content (map ('ignored_users ignored-users))))
(cl-find "m.ignored_user_list" account-data
:key (lambda (event) (alist-get 'type event))
:test #'equal)))
...))
(defun ement--room-in-space-p (room space)
"Return non-nil if ROOM is in SPACE on SESSION."
;; NOTE: Destructures slots in two structs to alternative variable
;; names, and destructures an alist key in each struct's `local'
;; slot to a variable of the same name.
(pcase-let* (((cl-struct ement-room (id parent-id) (local (map
children))) space)
((cl-struct ement-room (id child-id) (local (map
parents))) room))
...))
No alternative to pcase that omitted these features could take its place
for me. In a large package like Ement.el, where function after function
destructures similar objects in similar ways, the benefit of the
consistency, conciseness, and flexibility offered by pcase can't be
understated.
As well, pcase is easily extended with its built-in flexibility, e.g.
how easily support was added for the cl-type based pattern. It's a very
well-designed system.
Then there are pcase-lambda, pcase-dolist, and pcase-setq, all of which
use the same underlying facilities and patterns. It's a coherent
system: learning pcase opens up this world of useful forms. I would not
want to give up these powerful tools which make my programs better and
my programming more enjoyable.
next prev parent reply other threads:[~2023-12-18 5:41 UTC|newest]
Thread overview: 343+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-16 3:04 Instead of pcase Richard Stallman
2023-11-16 7:37 ` Philip Kaludercic
2023-11-16 17:18 ` T.V Raman
2023-11-16 17:44 ` Michael Heerdegen
2023-11-16 18:16 ` Philip Kaludercic
2023-11-17 8:54 ` Complex SPEC for variables/customization like font-lock-keywords/org-capture-templates/etc (was: Instead of pcase) Ihor Radchenko
2023-11-25 4:03 ` Complex SPEC for variables/customization like font-lock-keywords/org-capture-templates/etc Stefan Monnier
2023-11-16 19:19 ` Instead of pcase Eli Zaretskii
2023-11-17 8:02 ` Michael Heerdegen
2023-11-16 18:21 ` Dmitry Gutov
2023-11-16 18:39 ` T.V Raman
2023-11-16 18:47 ` Philip Kaludercic
2023-11-16 18:51 ` T.V Raman
2023-11-18 3:04 ` Richard Stallman
2023-11-19 12:23 ` Michael Heerdegen
2023-11-19 16:02 ` Barry Fishman
2023-11-19 17:59 ` Dmitry Gutov
2023-11-19 19:31 ` Eric Abrahamsen
2023-11-25 4:23 ` Stefan Monnier via Emacs development discussions.
2023-11-27 3:12 ` Richard Stallman
2023-11-19 21:15 ` Barry Fishman
2023-11-20 1:15 ` Dmitry Gutov
2023-11-20 15:32 ` Michael Heerdegen
2023-11-23 2:57 ` Richard Stallman
2023-11-24 17:14 ` Dmitry Gutov
2023-11-27 3:09 ` Richard Stallman
2023-11-27 12:21 ` Dmitry Gutov
2023-11-29 3:42 ` Richard Stallman
2023-11-29 12:56 ` Dmitry Gutov
2023-12-01 3:17 ` Richard Stallman
2023-11-28 2:44 ` Richard Stallman
2023-11-28 12:39 ` Dmitry Gutov
2023-11-30 3:37 ` Richard Stallman
2023-12-01 0:18 ` Dmitry Gutov
2023-12-01 5:51 ` Emanuel Berg
2023-12-10 8:34 ` Alfred M. Szmidt
2023-12-10 9:35 ` Eli Zaretskii
2023-12-10 9:53 ` Alfred M. Szmidt
2023-12-10 10:35 ` Eli Zaretskii
2023-12-10 11:05 ` Alfred M. Szmidt
2023-12-01 7:21 ` Eli Zaretskii
2023-12-01 8:03 ` Manuel Giraud via Emacs development discussions.
2023-12-02 3:21 ` Richard Stallman
2023-11-24 18:14 ` Michael Heerdegen
2023-11-24 18:35 ` Dmitry Gutov
2023-11-27 3:14 ` Richard Stallman
2023-11-28 2:46 ` Richard Stallman
2023-11-28 6:35 ` Nikita Domnitskii
2023-11-30 3:37 ` Richard Stallman
2023-12-02 21:37 ` Lynn Winebarger
2023-12-10 15:14 ` Richard Stallman
2023-12-10 16:27 ` Lynn Winebarger
2023-12-10 20:28 ` Michael Heerdegen via Emacs development discussions.
2023-12-10 21:13 ` Lynn Winebarger
2023-12-12 3:43 ` Richard Stallman
2023-12-12 6:46 ` Tomas Hlavaty
2023-12-12 15:18 ` [External] : " Drew Adams
2023-12-14 3:24 ` Richard Stallman
2023-12-14 16:52 ` Drew Adams
2023-12-16 4:24 ` Richard Stallman
2023-12-16 5:04 ` Drew Adams
2023-12-16 18:30 ` Bob Rogers
2023-12-18 4:13 ` Richard Stallman
2023-12-12 19:24 ` Tomas Hlavaty
2023-12-12 21:36 ` [External] : " Drew Adams
2023-12-12 22:25 ` Michael Heerdegen via Emacs development discussions.
2023-12-13 1:32 ` Adam Porter
2023-12-14 3:23 ` Richard Stallman
2023-12-16 4:23 ` Richard Stallman
2023-12-18 4:09 ` cond* Richard Stallman
2023-12-18 10:08 ` cond* João Távora
2023-12-21 4:20 ` cond* Richard Stallman
2023-12-21 9:50 ` cond* João Távora
2023-12-21 16:01 ` [External] : cond* Drew Adams
2023-12-21 16:20 ` João Távora
2023-12-24 3:56 ` Richard Stallman
2023-12-24 3:57 ` cond* Richard Stallman
2023-12-21 14:10 ` cond* Ihor Radchenko
2023-12-24 3:57 ` cond* Richard Stallman
2023-12-25 14:14 ` cond* Ihor Radchenko
2023-12-19 3:49 ` cond* Richard Stallman
2023-12-19 12:13 ` cond* João Távora
2023-12-22 3:14 ` cond* Richard Stallman
2023-12-22 7:27 ` cond* Philip Kaludercic
2023-12-25 3:41 ` cond* Richard Stallman
2023-12-25 12:32 ` cond* Philip Kaludercic
2023-12-27 4:54 ` cond* Richard Stallman
2023-12-27 14:34 ` cond* Philip Kaludercic
2023-12-29 3:52 ` cond* Richard Stallman
2024-01-01 14:49 ` cond* Ihor Radchenko
2024-01-03 4:13 ` cond* Richard Stallman
2024-01-03 15:57 ` cond* Ihor Radchenko
2024-01-05 4:23 ` cond* Richard Stallman
2024-01-06 14:33 ` cond* Ihor Radchenko
2024-01-06 22:25 ` [External] : cond* Drew Adams
2024-01-08 3:45 ` Richard Stallman
2024-01-08 15:20 ` Drew Adams
2024-01-09 2:53 ` map seq and radix-tree-leaf, in pcase Richard Stallman
2024-01-08 3:47 ` cond* Richard Stallman
2024-01-10 13:03 ` cond* Ihor Radchenko
2024-01-13 3:50 ` cond* Richard Stallman
2024-01-13 6:32 ` cond* Adam Porter
2024-01-16 3:31 ` cond* Richard Stallman
2024-01-13 19:47 ` cond* Ihor Radchenko
2024-01-15 3:13 ` cond* Richard Stallman
2024-01-08 3:47 ` cond* Richard Stallman
2024-01-08 15:13 ` cond* Ihor Radchenko
2024-01-27 3:37 ` cond* Richard Stallman
2024-02-01 16:26 ` cond* Ihor Radchenko
2024-02-03 3:36 ` cond* Richard Stallman
2024-02-03 16:52 ` cond* Ihor Radchenko
2024-01-03 4:13 ` cond* Richard Stallman
2024-01-03 15:48 ` cond* Ihor Radchenko
2024-01-06 4:31 ` cond* Richard Stallman
2024-01-06 13:09 ` cond* Ihor Radchenko
2024-01-08 3:47 ` cond* Richard Stallman
2024-01-08 15:26 ` cond* Ihor Radchenko
2024-01-27 3:37 ` cond* Richard Stallman
2024-01-03 4:13 ` cond* Richard Stallman
2024-01-03 15:50 ` cond* Ihor Radchenko
2024-01-06 4:31 ` cond* Richard Stallman
2024-01-06 13:13 ` cond* Ihor Radchenko
2024-01-08 3:47 ` cond* Richard Stallman
2024-01-08 15:35 ` cond* Ihor Radchenko
2023-12-19 15:53 ` [External] : cond* Drew Adams
2023-12-21 4:22 ` Richard Stallman
2023-12-21 4:22 ` Richard Stallman
2023-12-18 4:09 ` cond* Richard Stallman
2023-12-18 5:41 ` Adam Porter [this message]
2023-12-21 4:20 ` cond* Richard Stallman
2023-12-16 4:23 ` Instead of pcase Richard Stallman
2023-12-16 4:23 ` Richard Stallman
2023-12-16 6:57 ` Adam Porter
2023-12-20 3:28 ` Richard Stallman
2023-12-20 10:52 ` Adam Porter
2023-12-23 2:53 ` Richard Stallman
2023-12-23 2:53 ` Richard Stallman
2023-12-25 14:26 ` Ihor Radchenko
2023-12-27 4:54 ` Richard Stallman
2023-12-28 13:05 ` Ihor Radchenko
2023-12-30 3:20 ` Richard Stallman
2024-01-01 14:33 ` Ihor Radchenko
2024-01-03 4:13 ` Richard Stallman
2024-01-03 4:13 ` Richard Stallman
2024-01-03 16:08 ` Ihor Radchenko
2024-01-05 4:23 ` Richard Stallman
2024-01-06 13:04 ` Ihor Radchenko
2024-01-08 3:47 ` Richard Stallman
2024-01-08 15:42 ` Ihor Radchenko
2024-01-27 3:37 ` Richard Stallman
2023-12-13 4:58 ` Richard Stallman
2023-12-11 3:31 ` Richard Stallman
2023-11-19 13:49 ` Dmitry Gutov
2023-11-21 2:42 ` Richard Stallman
2023-11-21 5:14 ` Jim Porter
2023-11-21 5:34 ` Yuri Khan
2023-11-21 11:11 ` Dmitry Gutov
2023-11-21 15:38 ` Michael Heerdegen
2023-11-23 3:00 ` Richard Stallman
2023-11-24 3:34 ` Richard Stallman
2023-11-24 4:30 ` Jim Porter
2023-11-24 7:45 ` Eli Zaretskii
2023-11-25 3:08 ` Emanuel Berg
2023-11-24 17:01 ` Dmitry Gutov
2023-11-24 17:29 ` Lynn Winebarger
2023-11-28 2:44 ` Richard Stallman
2023-11-30 19:14 ` Lynn Winebarger
2023-11-30 19:26 ` Eli Zaretskii
2023-11-30 20:30 ` Michael Heerdegen via Emacs development discussions.
2023-12-01 6:24 ` Eli Zaretskii
2023-12-01 15:47 ` Michael Heerdegen via Emacs development discussions.
2023-12-01 16:07 ` Eli Zaretskii
2023-12-01 20:27 ` Alan Mackenzie
2023-12-02 13:24 ` Michael Heerdegen via Emacs development discussions.
2023-12-02 13:51 ` Emanuel Berg
2023-12-04 3:11 ` Richard Stallman
2023-12-03 3:28 ` Richard Stallman
2023-11-30 20:47 ` João Távora
2023-12-01 6:31 ` Eli Zaretskii
2023-12-01 7:07 ` Yuri Khan
2023-12-01 8:10 ` Eli Zaretskii
2023-12-01 9:04 ` Andreas Schwab
2023-12-04 3:08 ` Richard Stallman
2023-12-04 11:58 ` Eli Zaretskii
2023-12-04 12:35 ` Lynn Winebarger
2023-12-04 13:20 ` Eli Zaretskii
2023-12-04 17:46 ` Andreas Schwab
2023-12-07 2:48 ` Richard Stallman
2023-12-07 17:42 ` Andreas Schwab
2023-12-09 4:02 ` Richard Stallman
2023-12-04 18:17 ` Lynn Winebarger
2023-12-04 12:37 ` Dmitry Gutov
2023-12-08 3:54 ` Richard Stallman
2023-12-01 10:13 ` João Távora
2023-12-01 8:35 ` Andreas Schwab
2023-12-01 10:02 ` João Távora
2023-12-01 11:52 ` Eli Zaretskii
2023-12-01 12:48 ` Dmitry Gutov
2023-12-01 14:44 ` Eli Zaretskii
2023-12-01 18:28 ` Dmitry Gutov
2023-12-01 18:40 ` Eli Zaretskii
2023-12-01 18:45 ` João Távora
2024-01-09 5:36 ` Stefan Kangas
2023-12-01 13:28 ` João Távora
2023-12-01 16:25 ` Andreas Schwab
2024-01-09 5:33 ` Stefan Kangas
2024-01-09 10:43 ` João Távora
2023-12-01 16:04 ` Michael Heerdegen via Emacs development discussions.
2023-12-01 16:33 ` Eli Zaretskii
2023-12-02 3:20 ` Richard Stallman
2023-12-02 8:41 ` Andreas Schwab
2023-12-02 9:02 ` Philip Kaludercic
2023-12-02 10:14 ` Emanuel Berg
2023-12-02 17:02 ` Barry Fishman
2023-12-02 20:25 ` Michael Heerdegen via Emacs development discussions.
2023-12-03 4:30 ` Emanuel Berg
2023-12-05 2:58 ` Richard Stallman
2023-12-05 3:36 ` chad
2023-12-08 3:53 ` Richard Stallman
2023-12-02 14:33 ` Michael Heerdegen via Emacs development discussions.
2023-12-04 3:11 ` Richard Stallman
2023-12-02 18:01 ` Lynn Winebarger
2023-12-04 3:11 ` Richard Stallman
2023-12-04 12:27 ` Lynn Winebarger
2023-12-03 3:27 ` Richard Stallman
2023-11-25 4:15 ` Stefan Monnier
2023-11-27 3:12 ` Richard Stallman
2023-11-30 18:06 ` Michael Heerdegen
2023-11-16 18:49 ` Dmitry Gutov
2023-11-16 23:41 ` Emanuel Berg
2023-11-17 7:34 ` Eli Zaretskii
2023-11-26 3:17 ` Richard Stallman
2023-11-16 15:06 ` Michael Heerdegen
2023-11-16 17:31 ` T.V Raman
2023-11-16 18:26 ` Jim Porter
2023-11-16 18:40 ` T.V Raman
2023-11-16 19:13 ` Jim Porter
2023-11-20 3:06 ` Richard Stallman
2023-11-20 14:35 ` Michael Heerdegen
2023-11-23 2:57 ` Richard Stallman
2023-11-16 15:20 ` Spencer Baugh
2023-11-16 20:16 ` Tomas Hlavaty
2023-11-16 21:37 ` [External] : " Drew Adams
2023-11-25 4:34 ` Stefan Monnier via Emacs development discussions.
2023-11-25 8:53 ` Eli Zaretskii
2023-11-18 3:03 ` combining cond and let, to replace pcase Richard Stallman
2023-11-19 11:20 ` Michael Heerdegen
2023-11-19 11:43 ` Eli Zaretskii
2023-11-19 12:16 ` Gerd Möllmann
2023-11-19 13:21 ` Eli Zaretskii
2023-11-19 13:32 ` Gerd Möllmann
2023-11-19 14:41 ` Eli Zaretskii
2023-11-19 15:27 ` Gerd Möllmann
2023-11-19 15:29 ` Eli Zaretskii
2023-11-19 16:03 ` Joost Kremers
2023-11-19 16:59 ` Eli Zaretskii
2023-11-19 18:29 ` Joost Kremers
2023-11-19 18:35 ` Eli Zaretskii
2023-11-19 12:50 ` Michael Heerdegen
2023-11-19 13:08 ` Eli Zaretskii
2023-11-19 13:52 ` Michael Heerdegen
2023-11-19 14:45 ` Eli Zaretskii
2023-11-20 15:35 ` Michael Heerdegen
2023-11-20 16:37 ` Eli Zaretskii
2023-11-21 8:33 ` Michael Heerdegen
2023-11-21 8:39 ` Michael Heerdegen
2023-11-19 13:59 ` Dmitry Gutov
2023-11-19 14:49 ` Eli Zaretskii
2023-11-19 14:53 ` Dmitry Gutov
2023-11-19 12:04 ` Gerd Möllmann
2023-11-19 18:10 ` Tomas Hlavaty
2023-11-25 4:45 ` Stefan Monnier via Emacs development discussions.
2023-11-28 15:31 ` João Távora
2023-11-28 15:55 ` Stefan Monnier
2023-11-19 21:36 ` Alan Mackenzie
2023-11-21 16:14 ` Michael Heerdegen
2023-11-19 16:08 ` Axel Forsman
2023-11-21 15:53 ` Michael Heerdegen
2023-11-23 2:58 ` Richard Stallman
2023-11-23 7:02 ` Tomas Hlavaty
2023-11-26 3:14 ` Richard Stallman
2023-11-27 17:07 ` Tomas Hlavaty
2023-11-27 17:59 ` Yuri Khan
2023-11-28 14:25 ` Tomas Hlavaty
2023-11-23 8:58 ` Manuel Giraud via Emacs development discussions.
2023-11-26 3:14 ` Richard Stallman
2023-11-24 3:08 ` Daniel Semyonov
2023-11-24 3:26 ` Daniel Semyonov
2023-11-25 2:59 ` Richard Stallman
2023-11-25 5:11 ` Stefan Monnier via Emacs development discussions.
2023-11-27 3:11 ` Richard Stallman
2023-11-27 18:13 ` Manuel Giraud via Emacs development discussions.
2023-11-27 18:49 ` Yuri Khan
2023-11-27 23:12 ` Stefan Monnier
2023-11-29 3:41 ` Richard Stallman
2023-11-29 3:40 ` Richard Stallman
2023-11-27 3:11 ` Richard Stallman
2023-11-16 18:11 ` Instead of pcase Emanuel Berg
2023-11-16 19:26 ` Eli Zaretskii
2023-11-16 22:16 ` Emanuel Berg
2023-11-17 7:30 ` Eli Zaretskii
2023-11-17 8:09 ` Emanuel Berg
2023-11-17 12:16 ` Eli Zaretskii
2023-11-18 6:26 ` Emanuel Berg
2023-11-18 7:21 ` Po Lu
2023-11-18 7:41 ` Eli Zaretskii
2023-11-16 18:22 ` Jim Porter
2023-11-16 22:55 ` Emanuel Berg
2023-11-17 5:36 ` Po Lu
2023-11-19 11:48 ` Michael Heerdegen
2023-11-19 12:50 ` Eli Zaretskii
2023-11-19 14:05 ` Dmitry Gutov
2023-11-19 14:41 ` Po Lu
2023-11-19 14:44 ` Dmitry Gutov
2023-11-19 14:52 ` Eli Zaretskii
2023-11-19 14:58 ` Dmitry Gutov
2023-11-19 15:14 ` Eli Zaretskii
2023-11-19 18:04 ` Dmitry Gutov
2023-11-19 18:30 ` Eli Zaretskii
2023-11-19 18:51 ` Dmitry Gutov
2023-11-19 19:49 ` Eli Zaretskii
2023-11-21 2:43 ` Richard Stallman
2023-11-19 14:14 ` Michael Heerdegen
2023-11-19 15:09 ` Eli Zaretskii
2023-11-20 14:52 ` Michael Heerdegen
2023-11-19 14:29 ` Po Lu
2023-11-20 15:20 ` Michael Heerdegen
2023-11-20 15:29 ` Dmitry Gutov
2023-11-20 23:43 ` Po Lu
2023-11-21 1:09 ` Dmitry Gutov
2023-11-21 1:49 ` Po Lu
2023-11-21 1:59 ` Dmitry Gutov
2023-11-21 4:04 ` Po Lu
2023-11-21 11:27 ` Dmitry Gutov
2023-11-21 11:49 ` Po Lu
2023-11-20 23:45 ` Jose E. Marchesi
2023-11-20 23:54 ` Emanuel Berg
2023-11-21 2:01 ` Dmitry Gutov
2023-11-22 2:59 ` Richard Stallman
2023-11-22 3:29 ` Emanuel Berg
2023-11-22 11:58 ` Dmitry Gutov
2023-11-24 3:38 ` Richard Stallman
-- strict thread matches above, loose matches on Subject: below --
2023-12-23 6:17 Re: cond* Pedro Andres Aranda Gutierrez
2023-12-26 4:03 ` cond* Richard Stallman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a0ba6c11-a0df-46e3-a60e-901469f391f8@alphapapa.net \
--to=adam@alphapapa.net \
--cc=emacs-devel@gnu.org \
--cc=rms@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).