GNU bug report logs -
#59887
pcase vs. pcase-let: Underscore in backquote-style patterns
Previous Next
Reported by: hokomo <hokomo <at> airmail.cc>
Date: Wed, 7 Dec 2022 17:10:02 UTC
Severity: normal
Done: Michael Heerdegen <michael_heerdegen <at> web.de>
Bug is archived. No further changes may be made.
Full log
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
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
This bug report was last modified 2 years and 240 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.