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 ) rather than (seq > ...), 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)) )) ) > 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