bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#59887: pcase vs. pcase-let: Underscore in backquote-style patterns


From: hokomo
Subject: bug#59887: pcase vs. pcase-let: Underscore in backquote-style patterns
Date: Wed, 07 Dec 2022 17:28:57 +0100
User-agent: mu4e 1.8.9; emacs 28.2


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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]