emacs-devel
[Top][All Lists]
Advanced

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

Re: [Emacs-diffs] master 387e1e1: New version of `seq-let' based on a pc


From: Nicolas Petton
Subject: Re: [Emacs-diffs] master 387e1e1: New version of `seq-let' based on a pcase pattern
Date: Mon, 11 May 2015 15:42:39 +0200

Stefan Monnier writes:

>> +      (pcase-defmacro seq (bindings)
>> +        `(and ,@(seq--make-pcase-bindings bindings)))
>
> If you put a docstring in there, it will appear in "C-h f pcase RET", so
> you can use it to document the particular format you support.

Great, I'll do that.

> Also I see the following problems:
> - You only accept the form (seq <binding>) rather than (seq <binding1>
>   <binding2> ...), so typical cases will have to use (seq (a b)) instead
>   (seq a b).

Yes.  My idea of it was that you bind a sequence like the following:

    (seq [a b [c d]])

Or did you have something else in mind?

> - The above pcase pattern doesn't check that it's indeed a `seq'.
>   You should add a (pred seq-p).  It will automatically be optimized
>   away in `pcase-let', but is indispensable for the `pcase' situation to
>   do the right thing.

Ok, I'll do that.

>
>> +(defun seq--make-pcase-bindings (args &optional bindings nested-indexes)
> [...]
>> +    (seq-doseq (name args)
>> +      (unless rest-marker
>> +        (pcase name
>> +          ((pred seq-p)
>
> IIUC, this means that (pcase-let (((seq a (seq b c)) <obj>)) <body>)
> will bind the `seq' variable to the first element of the nested sequence
> (and `a' to the second and `b' to the third), whereas I think it should
> bind `b' to the first element of the nested sequence (which is what
> would happen if you simply removed this branch of this `pcase').
> I think removing this case will also remove the need for
> seq--nested-elt.

But then how can I have `seq-let' work the way it did until now? For
instance:

    (seq-let [a [b [c]]] my-vector
      ...)

>> +           (push `(app (seq--reverse-args #'seq--nested-elt
>> +                                          (reverse (cons ,index 
>> ',nested-indexes)))
>> +                       ,name)
>
> This reverse plus seq--reverse-args business seems
> hideously inefficient.  Why do you need that?

because of the way the `app' pattern works.  Or maybe I'm missing
something?


Nico
-- 
Nicolas Petton
http://nicolas-petton.fr

Attachment: signature.asc
Description: PGP signature


reply via email to

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