* bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected
@ 2024-06-12 8:40 Mekeor Melire
2024-06-14 8:42 ` Philip Kaludercic
0 siblings, 1 reply; 16+ messages in thread
From: Mekeor Melire @ 2024-06-12 8:40 UTC (permalink / raw)
To: 71503
I was expecting these two expressions to evaluate to the same value.
First, we call `pcase' on a value with a pattern involving `and' and
`guard':
(pcase "value"
((and v (guard (string= "not-value" v))) v))
;; => nil
Second, let's use the same value and pattern, but this time using
`pcase-lambda':
(funcall
(pcase-lambda
((and v (guard (string= "not-value" v)))) v)
"value")
;; => "value"
Am I missing something or is this a bug?
In GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version
3.24.41, cairo version 1.16.0).
^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected
2024-06-12 8:40 bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected Mekeor Melire
@ 2024-06-14 8:42 ` Philip Kaludercic
2024-06-14 16:08 ` Drew Adams via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-06-22 8:37 ` Eli Zaretskii
0 siblings, 2 replies; 16+ messages in thread
From: Philip Kaludercic @ 2024-06-14 8:42 UTC (permalink / raw)
To: Mekeor Melire; +Cc: 71503
Mekeor Melire <mekeor@posteo.de> writes:
> I was expecting these two expressions to evaluate to the same value.
> First, we call `pcase' on a value with a pattern involving `and' and
> `guard':
>
> (pcase "value"
> ((and v (guard (string= "not-value" v))) v))
> ;; => nil
>
> Second, let's use the same value and pattern, but this time using
> `pcase-lambda':
>
> (funcall
> (pcase-lambda
> ((and v (guard (string= "not-value" v)))) v)
> "value")
> ;; => "value"
>
> Am I missing something or is this a bug?
The difference is that pcase-lambda doesn't do case-distinction, but
just pattern matching/destruncting. So if the pattern-matching fails,
then the variable is just not bound, instead of the entire expression
falling back to returning no value/nil. I am guessing you wanted to
have something like Scheme's `case-lambda'[0]? Or we could clarify this
point in the docstring.
> In GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version
> 3.24.41, cairo version 1.16.0).
[0] https://index.scheme.org/filterset/r7rs_small/%28scheme%2520case-lambda%29/case-lambda
--
Philip Kaludercic on peregrine
^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected
2024-06-14 8:42 ` Philip Kaludercic
@ 2024-06-14 16:08 ` Drew Adams via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-06-22 8:37 ` Eli Zaretskii
1 sibling, 0 replies; 16+ messages in thread
From: Drew Adams via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-06-14 16:08 UTC (permalink / raw)
To: Philip Kaludercic, Mekeor Melire; +Cc: 71503@debbugs.gnu.org
> The difference is that pcase-lambda
> doesn't do case-distinction, but
> just pattern matching/destruncting.
Unless I'm mistaken, this confusion has
surfaced several times now...
Is it really a good idea to call this
"pcase-" <anything>, if it has nothing to
do with case distinction, i.e., control
flow?
Why not a name that suggests destructuring
or pattern-matching, and binding? Common
Lisp at least calls its (weaker) construct
`destructuring-bind' - pretty clear.
^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected
2024-06-14 8:42 ` Philip Kaludercic
2024-06-14 16:08 ` Drew Adams via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-06-22 8:37 ` Eli Zaretskii
2024-07-06 7:38 ` Eli Zaretskii
1 sibling, 1 reply; 16+ messages in thread
From: Eli Zaretskii @ 2024-06-22 8:37 UTC (permalink / raw)
To: Philip Kaludercic, Stefan Monnier; +Cc: mekeor, 71503
> Cc: 71503@debbugs.gnu.org
> From: Philip Kaludercic <philipk@posteo.net>
> Date: Fri, 14 Jun 2024 08:42:25 +0000
>
> Mekeor Melire <mekeor@posteo.de> writes:
>
> > I was expecting these two expressions to evaluate to the same value.
> > First, we call `pcase' on a value with a pattern involving `and' and
> > `guard':
> >
> > (pcase "value"
> > ((and v (guard (string= "not-value" v))) v))
> > ;; => nil
> >
> > Second, let's use the same value and pattern, but this time using
> > `pcase-lambda':
> >
> > (funcall
> > (pcase-lambda
> > ((and v (guard (string= "not-value" v)))) v)
> > "value")
> > ;; => "value"
> >
> > Am I missing something or is this a bug?
>
> The difference is that pcase-lambda doesn't do case-distinction, but
> just pattern matching/destruncting. So if the pattern-matching fails,
> then the variable is just not bound, instead of the entire expression
> falling back to returning no value/nil. I am guessing you wanted to
> have something like Scheme's `case-lambda'[0]? Or we could clarify this
> point in the docstring.
Would you mind suggesting a clarification for the doc string (and the
ELisp manual as well)?
Thanks.
^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected
2024-06-22 8:37 ` Eli Zaretskii
@ 2024-07-06 7:38 ` Eli Zaretskii
2024-07-20 9:42 ` Eli Zaretskii
0 siblings, 1 reply; 16+ messages in thread
From: Eli Zaretskii @ 2024-07-06 7:38 UTC (permalink / raw)
To: philipk; +Cc: mekeor, monnier, 71503
Ping!
> Cc: mekeor@posteo.de, 71503@debbugs.gnu.org
> Date: Sat, 22 Jun 2024 11:37:02 +0300
> From: Eli Zaretskii <eliz@gnu.org>
>
> > Cc: 71503@debbugs.gnu.org
> > From: Philip Kaludercic <philipk@posteo.net>
> > Date: Fri, 14 Jun 2024 08:42:25 +0000
> >
> > Mekeor Melire <mekeor@posteo.de> writes:
> >
> > > I was expecting these two expressions to evaluate to the same value.
> > > First, we call `pcase' on a value with a pattern involving `and' and
> > > `guard':
> > >
> > > (pcase "value"
> > > ((and v (guard (string= "not-value" v))) v))
> > > ;; => nil
> > >
> > > Second, let's use the same value and pattern, but this time using
> > > `pcase-lambda':
> > >
> > > (funcall
> > > (pcase-lambda
> > > ((and v (guard (string= "not-value" v)))) v)
> > > "value")
> > > ;; => "value"
> > >
> > > Am I missing something or is this a bug?
> >
> > The difference is that pcase-lambda doesn't do case-distinction, but
> > just pattern matching/destruncting. So if the pattern-matching fails,
> > then the variable is just not bound, instead of the entire expression
> > falling back to returning no value/nil. I am guessing you wanted to
> > have something like Scheme's `case-lambda'[0]? Or we could clarify this
> > point in the docstring.
>
> Would you mind suggesting a clarification for the doc string (and the
> ELisp manual as well)?
>
> Thanks.
>
>
>
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected
2024-07-06 7:38 ` Eli Zaretskii
@ 2024-07-20 9:42 ` Eli Zaretskii
2024-07-20 10:29 ` Philip Kaludercic
0 siblings, 1 reply; 16+ messages in thread
From: Eli Zaretskii @ 2024-07-20 9:42 UTC (permalink / raw)
To: philipk, mekeor; +Cc: monnier, 71503
Ping! Ping!
> Cc: mekeor@posteo.de, monnier@iro.umontreal.ca, 71503@debbugs.gnu.org
> Date: Sat, 06 Jul 2024 10:38:00 +0300
> From: Eli Zaretskii <eliz@gnu.org>
>
> Ping!
>
> > Cc: mekeor@posteo.de, 71503@debbugs.gnu.org
> > Date: Sat, 22 Jun 2024 11:37:02 +0300
> > From: Eli Zaretskii <eliz@gnu.org>
> >
> > > Cc: 71503@debbugs.gnu.org
> > > From: Philip Kaludercic <philipk@posteo.net>
> > > Date: Fri, 14 Jun 2024 08:42:25 +0000
> > >
> > > Mekeor Melire <mekeor@posteo.de> writes:
> > >
> > > > I was expecting these two expressions to evaluate to the same value.
> > > > First, we call `pcase' on a value with a pattern involving `and' and
> > > > `guard':
> > > >
> > > > (pcase "value"
> > > > ((and v (guard (string= "not-value" v))) v))
> > > > ;; => nil
> > > >
> > > > Second, let's use the same value and pattern, but this time using
> > > > `pcase-lambda':
> > > >
> > > > (funcall
> > > > (pcase-lambda
> > > > ((and v (guard (string= "not-value" v)))) v)
> > > > "value")
> > > > ;; => "value"
> > > >
> > > > Am I missing something or is this a bug?
> > >
> > > The difference is that pcase-lambda doesn't do case-distinction, but
> > > just pattern matching/destruncting. So if the pattern-matching fails,
> > > then the variable is just not bound, instead of the entire expression
> > > falling back to returning no value/nil. I am guessing you wanted to
> > > have something like Scheme's `case-lambda'[0]? Or we could clarify this
> > > point in the docstring.
> >
> > Would you mind suggesting a clarification for the doc string (and the
> > ELisp manual as well)?
> >
> > Thanks.
> >
> >
> >
> >
>
>
>
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected
2024-07-20 9:42 ` Eli Zaretskii
@ 2024-07-20 10:29 ` Philip Kaludercic
2024-07-20 10:46 ` Eli Zaretskii
2024-07-20 14:06 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 2 replies; 16+ messages in thread
From: Philip Kaludercic @ 2024-07-20 10:29 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: mekeor, monnier, 71503
[-- Attachment #1: Type: text/plain, Size: 1805 bytes --]
Eli Zaretskii <eliz@gnu.org> writes:
> Ping! Ping!
>
>> Cc: mekeor@posteo.de, monnier@iro.umontreal.ca, 71503@debbugs.gnu.org
>> Date: Sat, 06 Jul 2024 10:38:00 +0300
>> From: Eli Zaretskii <eliz@gnu.org>
>>
>> Ping!
>>
>> > Cc: mekeor@posteo.de, 71503@debbugs.gnu.org
>> > Date: Sat, 22 Jun 2024 11:37:02 +0300
>> > From: Eli Zaretskii <eliz@gnu.org>
>> >
>> > > Cc: 71503@debbugs.gnu.org
>> > > From: Philip Kaludercic <philipk@posteo.net>
>> > > Date: Fri, 14 Jun 2024 08:42:25 +0000
>> > >
>> > > Mekeor Melire <mekeor@posteo.de> writes:
>> > >
>> > > > I was expecting these two expressions to evaluate to the same value.
>> > > > First, we call `pcase' on a value with a pattern involving `and' and
>> > > > `guard':
>> > > >
>> > > > (pcase "value"
>> > > > ((and v (guard (string= "not-value" v))) v))
>> > > > ;; => nil
>> > > >
>> > > > Second, let's use the same value and pattern, but this time using
>> > > > `pcase-lambda':
>> > > >
>> > > > (funcall
>> > > > (pcase-lambda
>> > > > ((and v (guard (string= "not-value" v)))) v)
>> > > > "value")
>> > > > ;; => "value"
>> > > >
>> > > > Am I missing something or is this a bug?
>> > >
>> > > The difference is that pcase-lambda doesn't do case-distinction, but
>> > > just pattern matching/destruncting. So if the pattern-matching fails,
>> > > then the variable is just not bound, instead of the entire expression
>> > > falling back to returning no value/nil. I am guessing you wanted to
>> > > have something like Scheme's `case-lambda'[0]? Or we could clarify this
>> > > point in the docstring.
>> >
>> > Would you mind suggesting a clarification for the doc string (and the
>> > ELisp manual as well)?
Sorry, I didn't realise you were pining me. I was thinking of something
like
[-- Attachment #2: Type: text/plain, Size: 920 bytes --]
diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el
index 5a7f3995311..f546ba34c7c 100644
--- a/lisp/emacs-lisp/pcase.el
+++ b/lisp/emacs-lisp/pcase.el
@@ -241,9 +241,10 @@ pcase-exhaustive
;;;###autoload
(defmacro pcase-lambda (lambda-list &rest body)
"Like `lambda' but allow each argument to be a pattern.
-I.e. accepts the usual &optional and &rest keywords, but every
-formal argument can be any pattern accepted by `pcase' (a mere
-variable name being but a special case of it)."
+I.e. accepts the usual &optional and &rest keywords, but every formal
+argument can be any pattern accepted by `pcase' (a mere variable name
+being but a special case of it). Keep in mind that BODY is always
+evaluated, regardless of whether the argument-patterns match or not."
(declare (doc-string 2) (indent defun)
(debug (&define (&rest pcase-PAT) lambda-doc def-body)))
(let* ((bindings ())
[-- Attachment #3: Type: text/plain, Size: 493 bytes --]
but now I notice that `pcase-let*' documents that all expressions should
match,
Each EXP should match its respective PATTERN (i.e. be of structure
compatible to PATTERN); a mismatch may signal an error or may go
undetected, binding variables to arbitrary values, such as nil.
Since `pcase-lambda' inherits these semantics we would have to propagate
this promise -- or be more specific about what happens, e.g. binding
values to nil.
>> > Thanks.
--
Philip Kaludercic on peregrine
^ permalink raw reply related [flat|nested] 16+ messages in thread
* bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected
2024-07-20 10:29 ` Philip Kaludercic
@ 2024-07-20 10:46 ` Eli Zaretskii
2024-07-21 11:17 ` Philip Kaludercic
2024-07-20 14:06 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
1 sibling, 1 reply; 16+ messages in thread
From: Eli Zaretskii @ 2024-07-20 10:46 UTC (permalink / raw)
To: Philip Kaludercic; +Cc: mekeor, monnier, 71503
> From: Philip Kaludercic <philipk@posteo.net>
> Cc: mekeor@posteo.de, monnier@iro.umontreal.ca, 71503@debbugs.gnu.org
> Date: Sat, 20 Jul 2024 10:29:55 +0000
>
> >> > > The difference is that pcase-lambda doesn't do case-distinction, but
> >> > > just pattern matching/destruncting. So if the pattern-matching fails,
> >> > > then the variable is just not bound, instead of the entire expression
> >> > > falling back to returning no value/nil. I am guessing you wanted to
> >> > > have something like Scheme's `case-lambda'[0]? Or we could clarify this
> >> > > point in the docstring.
> >> >
> >> > Would you mind suggesting a clarification for the doc string (and the
> >> > ELisp manual as well)?
>
> Sorry, I didn't realise you were pining me. I was thinking of something
> like
>
> diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el
> index 5a7f3995311..f546ba34c7c 100644
> --- a/lisp/emacs-lisp/pcase.el
> +++ b/lisp/emacs-lisp/pcase.el
> @@ -241,9 +241,10 @@ pcase-exhaustive
> ;;;###autoload
> (defmacro pcase-lambda (lambda-list &rest body)
> "Like `lambda' but allow each argument to be a pattern.
> -I.e. accepts the usual &optional and &rest keywords, but every
> -formal argument can be any pattern accepted by `pcase' (a mere
> -variable name being but a special case of it)."
> +I.e. accepts the usual &optional and &rest keywords, but every formal
> +argument can be any pattern accepted by `pcase' (a mere variable name
> +being but a special case of it). Keep in mind that BODY is always
> +evaluated, regardless of whether the argument-patterns match or not."
> (declare (doc-string 2) (indent defun)
> (debug (&define (&rest pcase-PAT) lambda-doc def-body)))
> (let* ((bindings ())
>
> but now I notice that `pcase-let*' documents that all expressions should
> match,
>
> Each EXP should match its respective PATTERN (i.e. be of structure
> compatible to PATTERN); a mismatch may signal an error or may go
> undetected, binding variables to arbitrary values, such as nil.
>
> Since `pcase-lambda' inherits these semantics we would have to propagate
> this promise -- or be more specific about what happens, e.g. binding
> values to nil.
Thanks. If this still can be fixed by some documentation changes, I'd
prefer to do that.
^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected
2024-07-20 10:29 ` Philip Kaludercic
2024-07-20 10:46 ` Eli Zaretskii
@ 2024-07-20 14:06 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-21 12:39 ` Philip Kaludercic
1 sibling, 1 reply; 16+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-20 14:06 UTC (permalink / raw)
To: Philip Kaludercic; +Cc: mekeor, Eli Zaretskii, 71503
> (defmacro pcase-lambda (lambda-list &rest body)
> "Like `lambda' but allow each argument to be a pattern.
> -I.e. accepts the usual &optional and &rest keywords, but every
> -formal argument can be any pattern accepted by `pcase' (a mere
> -variable name being but a special case of it)."
> +I.e. accepts the usual &optional and &rest keywords, but every formal
> +argument can be any pattern accepted by `pcase' (a mere variable name
> +being but a special case of it). Keep in mind that BODY is always
> +evaluated, regardless of whether the argument-patterns match or not."
> (declare (doc-string 2) (indent defun)
> (debug (&define (&rest pcase-PAT) lambda-doc def-body)))
> (let* ((bindings ())
I tend to call "any pattern accepted by `pcase'" a "Pcase pattern".
More importantly, we should refer to `pcase-let` rather than to
`pcase` here and we should likely use the term "destructuring (binding)".
Stefan
^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected
2024-07-20 10:46 ` Eli Zaretskii
@ 2024-07-21 11:17 ` Philip Kaludercic
2024-07-21 13:33 ` Mekeor Melire
0 siblings, 1 reply; 16+ messages in thread
From: Philip Kaludercic @ 2024-07-21 11:17 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: mekeor, monnier, 71503
[-- Attachment #1: Type: text/plain, Size: 2797 bytes --]
Eli Zaretskii <eliz@gnu.org> writes:
>> From: Philip Kaludercic <philipk@posteo.net>
>> Cc: mekeor@posteo.de, monnier@iro.umontreal.ca, 71503@debbugs.gnu.org
>> Date: Sat, 20 Jul 2024 10:29:55 +0000
>>
>> >> > > The difference is that pcase-lambda doesn't do case-distinction, but
>> >> > > just pattern matching/destruncting. So if the pattern-matching fails,
>> >> > > then the variable is just not bound, instead of the entire expression
>> >> > > falling back to returning no value/nil. I am guessing you wanted to
>> >> > > have something like Scheme's `case-lambda'[0]? Or we could
>> >> > > clarify this
>> >> > > point in the docstring.
>> >> >
>> >> > Would you mind suggesting a clarification for the doc string (and the
>> >> > ELisp manual as well)?
>>
>> Sorry, I didn't realise you were pining me. I was thinking of something
>> like
>>
>> diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el
>> index 5a7f3995311..f546ba34c7c 100644
>> --- a/lisp/emacs-lisp/pcase.el
>> +++ b/lisp/emacs-lisp/pcase.el
>> @@ -241,9 +241,10 @@ pcase-exhaustive
>> ;;;###autoload
>> (defmacro pcase-lambda (lambda-list &rest body)
>> "Like `lambda' but allow each argument to be a pattern.
>> -I.e. accepts the usual &optional and &rest keywords, but every
>> -formal argument can be any pattern accepted by `pcase' (a mere
>> -variable name being but a special case of it)."
>> +I.e. accepts the usual &optional and &rest keywords, but every formal
>> +argument can be any pattern accepted by `pcase' (a mere variable name
>> +being but a special case of it). Keep in mind that BODY is always
>> +evaluated, regardless of whether the argument-patterns match or not."
>> (declare (doc-string 2) (indent defun)
>> (debug (&define (&rest pcase-PAT) lambda-doc def-body)))
>> (let* ((bindings ())
>>
>> but now I notice that `pcase-let*' documents that all expressions should
>> match,
>>
>> Each EXP should match its respective PATTERN (i.e. be of structure
>> compatible to PATTERN); a mismatch may signal an error or may go
>> undetected, binding variables to arbitrary values, such as nil.
>>
>> Since `pcase-lambda' inherits these semantics we would have to propagate
>> this promise -- or be more specific about what happens, e.g. binding
>> values to nil.
>
> Thanks. If this still can be fixed by some documentation changes, I'd
> prefer to do that.
In that case I think it would be better to stick to a warning like the
one in `pcase-let*'..
Stefan Monnier <monnier@iro.umontreal.ca> writes:
[...]
> I tend to call "any pattern accepted by `pcase'" a "Pcase pattern".
> More importantly, we should refer to `pcase-let` rather than to
> `pcase` here and we should likely use the term "destructuring (binding)".
What do you think of:
[-- Attachment #2: Type: text/plain, Size: 1042 bytes --]
diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el
index 5a7f3995311..fd6b0c8db5c 100644
--- a/lisp/emacs-lisp/pcase.el
+++ b/lisp/emacs-lisp/pcase.el
@@ -241,9 +241,14 @@ pcase-exhaustive
;;;###autoload
(defmacro pcase-lambda (lambda-list &rest body)
"Like `lambda' but allow each argument to be a pattern.
-I.e. accepts the usual &optional and &rest keywords, but every
-formal argument can be any pattern accepted by `pcase' (a mere
-variable name being but a special case of it)."
+I.e. accepts the usual &optional and &rest keywords, but every formal
+argument can be any pattern destructed by `pcase-let' (a mere variable
+name being but a special case of it).
+
+Each argument should match its respective pattern in the parameter
+list (i.e. be of a compatible structure); a mismatch may signal an error
+or may go undetected, binding arguments to arbitrary values, such as
+nil."
(declare (doc-string 2) (indent defun)
(debug (&define (&rest pcase-PAT) lambda-doc def-body)))
(let* ((bindings ())
[-- Attachment #3: Type: text/plain, Size: 59 bytes --]
> Stefan
>
--
Philip Kaludercic on peregrine
^ permalink raw reply related [flat|nested] 16+ messages in thread
* bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected
2024-07-20 14:06 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-21 12:39 ` Philip Kaludercic
2024-07-21 13:51 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 1 reply; 16+ messages in thread
From: Philip Kaludercic @ 2024-07-21 12:39 UTC (permalink / raw)
To: Stefan Monnier; +Cc: mekeor, Eli Zaretskii, 71503
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> (defmacro pcase-lambda (lambda-list &rest body)
>> "Like `lambda' but allow each argument to be a pattern.
>> -I.e. accepts the usual &optional and &rest keywords, but every
>> -formal argument can be any pattern accepted by `pcase' (a mere
>> -variable name being but a special case of it)."
>> +I.e. accepts the usual &optional and &rest keywords, but every formal
>> +argument can be any pattern accepted by `pcase' (a mere variable name
>> +being but a special case of it). Keep in mind that BODY is always
>> +evaluated, regardless of whether the argument-patterns match or not."
>> (declare (doc-string 2) (indent defun)
>> (debug (&define (&rest pcase-PAT) lambda-doc def-body)))
>> (let* ((bindings ())
>
> I tend to call "any pattern accepted by `pcase'" a "Pcase pattern".
> More importantly, we should refer to `pcase-let` rather than to
> `pcase` here and we should likely use the term "destructuring (binding)".
Another confusing behaviour that we should document is that in
(let ((a nil))
(funcall
(pcase-lambda (a (and (guard a) b))
(list a b))
1 2))
I would expect that the (guard a) would use the nil binding from the
`let' form, but instead it is ignored and b is bound to 2. I am not
sure if this is related to the "destructing" point or not.
>
>
> Stefan
>
--
Philip Kaludercic on peregrine
^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected
2024-07-21 11:17 ` Philip Kaludercic
@ 2024-07-21 13:33 ` Mekeor Melire
0 siblings, 0 replies; 16+ messages in thread
From: Mekeor Melire @ 2024-07-21 13:33 UTC (permalink / raw)
To: 71503; +Cc: Philip Kaludercic, Eli Zaretskii, monnier
2024-07-21 11:17 philipk@posteo.net:
> What do you think of:
> "Like `lambda' but allow each argument to be a pattern.
> -I.e. accepts the usual &optional and &rest keywords, but every
> -formal argument can be any pattern accepted by `pcase' (a mere
> -variable name being but a special case of it)."
> +I.e. accepts the usual &optional and &rest keywords, but every formal
> +argument can be any pattern destructed by `pcase-let' (a mere variable
> +name being but a special case of it).
> +
> +Each argument should match its respective pattern in the parameter
> +list (i.e. be of a compatible structure); a mismatch may signal an error
> +or may go undetected, binding arguments to arbitrary values, such as
> +nil."
> (declare (doc-string 2) (indent defun)
> (debug (&define (&rest pcase-PAT) lambda-doc def-body)))
> (let* ((bindings ())
Being the submitter of this bug-report, this suggested change would
indeed fix the problem for me and would avoid confusion. I thus support
this change and thank y'all for your efforts.
^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected
2024-07-21 12:39 ` Philip Kaludercic
@ 2024-07-21 13:51 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-08-04 7:58 ` Eli Zaretskii
0 siblings, 1 reply; 16+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-21 13:51 UTC (permalink / raw)
To: Philip Kaludercic; +Cc: mekeor, Eli Zaretskii, 71503
> Another confusing behaviour that we should document is that in
>
> (let ((a nil))
> (funcall
> (pcase-lambda (a (and (guard a) b))
> (list a b))
> 1 2))
>
> I would expect that the (guard a) would use the nil binding from the
> `let' form, but instead it is ignored and b is bound to 2. I am not
> sure if this is related to the "destructing" point or not.
It most definitely is: the `guard` controls here whether the pattern
matches or not, but since it's a destructuring match `pcase` takes it
for granted that the pattern does match, so the guard is ignored.
What might be more confusing is the scoping, e.g.:
(macroexpand '(pcase-lambda ((and (guard a) b) a) (FOO)))
=>
#'(lambda (arg0 a) (pcase-let* (((and (guard a) b) arg0)) (FOO)))
so the `a` in the guard refers to the argument that follows rather than
to a surrounding `a` binding.
Stefan
^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected
2024-07-21 13:51 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-08-04 7:58 ` Eli Zaretskii
2024-08-04 14:54 ` Philip Kaludercic
0 siblings, 1 reply; 16+ messages in thread
From: Eli Zaretskii @ 2024-08-04 7:58 UTC (permalink / raw)
To: Stefan Monnier; +Cc: mekeor, philipk, 71503
Ping! can we please make progress with this issue, one way or
another?
> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Eli Zaretskii <eliz@gnu.org>, mekeor@posteo.de, 71503@debbugs.gnu.org
> Date: Sun, 21 Jul 2024 09:51:04 -0400
>
> > Another confusing behaviour that we should document is that in
> >
> > (let ((a nil))
> > (funcall
> > (pcase-lambda (a (and (guard a) b))
> > (list a b))
> > 1 2))
> >
> > I would expect that the (guard a) would use the nil binding from the
> > `let' form, but instead it is ignored and b is bound to 2. I am not
> > sure if this is related to the "destructing" point or not.
>
> It most definitely is: the `guard` controls here whether the pattern
> matches or not, but since it's a destructuring match `pcase` takes it
> for granted that the pattern does match, so the guard is ignored.
>
> What might be more confusing is the scoping, e.g.:
>
> (macroexpand '(pcase-lambda ((and (guard a) b) a) (FOO)))
> =>
> #'(lambda (arg0 a) (pcase-let* (((and (guard a) b) arg0)) (FOO)))
>
> so the `a` in the guard refers to the argument that follows rather than
> to a surrounding `a` binding.
>
>
> Stefan
>
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected
2024-08-04 7:58 ` Eli Zaretskii
@ 2024-08-04 14:54 ` Philip Kaludercic
2024-08-04 15:08 ` Eli Zaretskii
0 siblings, 1 reply; 16+ messages in thread
From: Philip Kaludercic @ 2024-08-04 14:54 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: mekeor, Stefan Monnier, 71503-done
Eli Zaretskii <eliz@gnu.org> writes:
> Ping! can we please make progress with this issue, one way or
> another?
I've pushed the change in 0756f308 that Mekeor previously acknowledged
as fine. Closing.
>> From: Stefan Monnier <monnier@iro.umontreal.ca>
>> Cc: Eli Zaretskii <eliz@gnu.org>, mekeor@posteo.de, 71503@debbugs.gnu.org
>> Date: Sun, 21 Jul 2024 09:51:04 -0400
>>
>> > Another confusing behaviour that we should document is that in
>> >
>> > (let ((a nil))
>> > (funcall
>> > (pcase-lambda (a (and (guard a) b))
>> > (list a b))
>> > 1 2))
>> >
>> > I would expect that the (guard a) would use the nil binding from the
>> > `let' form, but instead it is ignored and b is bound to 2. I am not
>> > sure if this is related to the "destructing" point or not.
>>
>> It most definitely is: the `guard` controls here whether the pattern
>> matches or not, but since it's a destructuring match `pcase` takes it
>> for granted that the pattern does match, so the guard is ignored.
>>
>> What might be more confusing is the scoping, e.g.:
>>
>> (macroexpand '(pcase-lambda ((and (guard a) b) a) (FOO)))
>> =>
>> #'(lambda (arg0 a) (pcase-let* (((and (guard a) b) arg0)) (FOO)))
>>
>> so the `a` in the guard refers to the argument that follows rather than
>> to a surrounding `a` binding.
>>
>>
>> Stefan
>>
>>
--
Philip Kaludercic on peregrine
^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected
2024-08-04 14:54 ` Philip Kaludercic
@ 2024-08-04 15:08 ` Eli Zaretskii
0 siblings, 0 replies; 16+ messages in thread
From: Eli Zaretskii @ 2024-08-04 15:08 UTC (permalink / raw)
To: Philip Kaludercic; +Cc: mekeor, monnier, 71503-done
> From: Philip Kaludercic <philipk@posteo.net>
> Cc: Stefan Monnier <monnier@iro.umontreal.ca>, mekeor@posteo.de,
> 71503-done@debbugs.gnu.org
> Date: Sun, 04 Aug 2024 14:54:44 +0000
>
> Eli Zaretskii <eliz@gnu.org> writes:
>
> > Ping! can we please make progress with this issue, one way or
> > another?
>
> I've pushed the change in 0756f308 that Mekeor previously acknowledged
> as fine. Closing.
Thanks!
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2024-08-04 15:08 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-12 8:40 bug#71503: 30.0.50; pcase-lambda (with "and" and "guard") does not work as expected Mekeor Melire
2024-06-14 8:42 ` Philip Kaludercic
2024-06-14 16:08 ` Drew Adams via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-06-22 8:37 ` Eli Zaretskii
2024-07-06 7:38 ` Eli Zaretskii
2024-07-20 9:42 ` Eli Zaretskii
2024-07-20 10:29 ` Philip Kaludercic
2024-07-20 10:46 ` Eli Zaretskii
2024-07-21 11:17 ` Philip Kaludercic
2024-07-21 13:33 ` Mekeor Melire
2024-07-20 14:06 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-21 12:39 ` Philip Kaludercic
2024-07-21 13:51 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-08-04 7:58 ` Eli Zaretskii
2024-08-04 14:54 ` Philip Kaludercic
2024-08-04 15:08 ` Eli Zaretskii
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).