emacs-devel
[Top][All Lists]
Advanced

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

Re: combining cond and let, to replace pcase.


From: Tomas Hlavaty
Subject: Re: combining cond and let, to replace pcase.
Date: Mon, 27 Nov 2023 18:07:58 +0100

On Sat 25 Nov 2023 at 22:14, Richard Stallman <rms@gnu.org> wrote:
>   > >        ;; Same as a clause in `cond',
>   > >        (CONDITION
>   > >         do-this-if-CONDITION-then-exit...)
>   > >
>   > >        ;; Variables to bind, as in let
>   > >        (:bind (x foobar) y z (foo 5) a)
>   > >        ;; Bindings continue in effect.
>
>   > This seems nicer:
>
>   > (if CONDITION
>   >     do-this-if-CONDITION-then-exit...
>   >     (let ((x foobar) y z (foo 5) a)
>   >       ...))
>
> That is what you can do now with `if' and `let', but many levels of
> nexting get to be inconvenient and hard to read.  That is one of the
> practical conveniences of _using_ `pcase'.  I think a replacement for
> `pcase' should offer the same advantage.

if you are after less nesting, cond or or can already do that:

   (cond
     ;; Same as a clause in `cond',
     (CONDITION
      do-this-if-CONDITION-then-exit...)
     ;; Variables to bind, as in let
     ((let ((x foobar) y z (foo 5) a)
       ;; Bindings continue in effect.
       ...))
     ...)

even better:

   (or
     ;; Same as a clause in `cond',
     (when CONDITION
       do-this-if-CONDITION-then-exit...)
     ;; Variables to bind, as in let
     (let ((x foobar) y z (foo 5) a)
       ;; Bindings continue in effect.
       ...)
     ...)

no need for :bind which seems like superficial syntax that requires
extra cond* macro definition with weird rules.

>   > It looks like everybody is trying to design a "do it all super-macro"
>
> If that refers to the approach of `pcase', in which there are dozens
> of different features one must learn, then `cond*' represents turning
> away from that approach.  `cond*' has just four features, two of which
> are modified from `cond'.
>
> That's why `cond*' will impose less burden of language complexity than
> `pcase'.

or, when, let are even simpler and the example with or is even more
readable.  I do not see what cond* brings.  It seems that existing forms
cover the control flow part well enough.  What should be the focus is
the destructuring part, like cl-destructuring-bind or your match,
match-set, match-bind or the matching part of pcase.

Btw there is even a kind of user-configurable version of the or macro, a
kind of pluggable-or called run-hook-with-args-until-success which is
like the or macro but with cases as functions in a list.  This could
allow for use-extensible variant, if the destructuring part was separate
and reuseable.



reply via email to

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