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

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

bug#59887: closed (pcase vs. pcase-let: Underscore in backquote-style pa


From: GNU bug Tracking System
Subject: bug#59887: closed (pcase vs. pcase-let: Underscore in backquote-style patterns)
Date: Mon, 12 Dec 2022 02:51:01 +0000

Your message dated Mon, 12 Dec 2022 03:50:41 +0100
with message-id <87v8mhmj26.fsf@web.de>
and subject line Re: bug#59887: pcase vs. pcase-let: Underscore in 
backquote-style patterns
has caused the debbugs.gnu.org bug report #59887,
regarding pcase vs. pcase-let: Underscore in backquote-style patterns
to be marked as done.

(If you believe you have received this mail in error, please contact
help-debbugs@gnu.org.)


-- 
59887: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=59887
GNU Bug Tracking System
Contact help-debbugs@gnu.org with problems
--- Begin Message --- Subject: 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



--- End Message ---
--- Begin Message --- Subject: Re: bug#59887: pcase vs. pcase-let: Underscore in backquote-style patterns Date: Mon, 12 Dec 2022 03:50:41 +0100 User-agent: Gnus/5.13 (Gnus v5.13)
hokomo <hokomo@airmail.cc> writes:

> How exactly is the underscore symbol treated in pcase's
> backquote-style patterns?

I think the current behavior can be understood and explained from the
documentation quite well.  If you can point to something concrete
missing, please elaborate, and we can reopen this report.

For now I'm closing it: everything works as documented, and we had
decided not to complicate the semantics of `_`, so as far as I see it
nothing is to be done here.


Thanks,

Michael.


--- End Message ---

reply via email to

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