From: hokomo <hokomo@airmail.cc>
To: 59887@debbugs.gnu.org
Subject: bug#59887: pcase vs. pcase-let: Underscore in backquote-style patterns
Date: Wed, 07 Dec 2022 17:28:57 +0100 [thread overview]
Message-ID: <87sfhrqgxw.fsf@airmail.cc> (raw)
Hello,
How exactly is the underscore symbol treated in pcase's
backquote-style patterns? Seems like at least pcase and pcase-let
treat it inconsistently (I haven't checked the other pcase
operators).
pcase treats the underscore as a literal symbol to match, hence
this fails:
(pcase '(1 2 3)
(`(1 _ ,x)
x))
;; => nil
Adding the missing comma in front of the underscore gives us the
expected behavior:
(pcase '(1 2 3)
(`(1 ,_ ,x)
x))
;; => 3
However, pcase-let is less strict about this, producing the same
result with or without the comma:
(pcase-let ((`(1 _ ,x) '(1 2 3)))
x)
;; => 3
(pcase-let ((`(1 ,_ ,x) '(1 2 3)))
x)
;; => 3
Additionally, I would think one would still be able to match a
literal underscore symbol even with pcase-let, but the following
still ends up matching:
(pcase-let ((`(1 ,'_ ,x) '(1 2 3)))
x)
;; => 3
I think that matching a literal underscore symbol is rare enough
that the ideal behavior would probably be for an underscore within
a backquote template to be treated as a wildcard whenever it
appears literally (e.g., `(1 _)) or unquoted (e.g., `(1 ,_)).
However, as soon as explicitly quoted (e.g., `(1 ,'_)), it should
be treated as a match for a literal underscore symbol. In other
words, I would expect the following would be different from the
above:
(pcase '(1 2 3)
(`(1 _ ,x)
x))
;; => 3 (instead of nil)
(pcase-let ((`(1 ,'_ ,x) '(1 2 3)))
x)
;; => nil (instead of 3)
I'm not 100% sure if these requirements would cause any
backwards-incompatible changes or inconsistencies with the other
pcase operators though. I'm also assuming that `(1 _) and `(1 ,'_)
can be distinguished, but maybe this is not true?
hokomo
next reply other threads:[~2022-12-07 16:28 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-07 16:28 hokomo [this message]
2022-12-09 2:57 ` bug#59887: pcase vs. pcase-let: Underscore in backquote-style patterns Michael Heerdegen
2022-12-12 2:50 ` Michael Heerdegen
2022-12-12 18:26 ` hokomo
2022-12-13 1:17 ` Michael Heerdegen
2022-12-13 1:19 ` hokomo
2022-12-13 2:21 ` Michael Heerdegen
2022-12-13 2:26 ` hokomo
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87sfhrqgxw.fsf@airmail.cc \
--to=hokomo@airmail.cc \
--cc=59887@debbugs.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 external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.