unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Generic sequences in seq.el
@ 2018-12-21 11:42 Yuan Fu
  2018-12-21 14:24 ` Stefan Monnier
  0 siblings, 1 reply; 6+ messages in thread
From: Yuan Fu @ 2018-12-21 11:42 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 784 bytes --]

I'm trying to "upgrade" some methods from supporting list to supporting
generic sequence.
However, I couldn't figure out how to change the value of a sequence
destructively.
E.g., if I want to insert a element into a list, I can do something like

    (setf (nthcdr n seq) (cons element (nthcdr n seq)))

to insert element into the nth position in seq

But with sequences, I don't see any generic functions that can do similar
work.
Am I missing something?

BTW, what I'm doing now is define my own generic function, like

    (cl-defgeneric my-insert-at (elt seq)))

The idea is I'll implement this function for the generic sequence
that I'll define in the future. Is that a correct approach?
Other destructive functions that I couldn't find alternatives are delete,
push, pop, etc.

[-- Attachment #2: Type: text/html, Size: 2165 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Generic sequences in seq.el
  2018-12-21 11:42 Generic sequences in seq.el Yuan Fu
@ 2018-12-21 14:24 ` Stefan Monnier
  2018-12-23  2:04   ` Yuan Fu
  0 siblings, 1 reply; 6+ messages in thread
From: Stefan Monnier @ 2018-12-21 14:24 UTC (permalink / raw)
  To: emacs-devel

>     (setf (nthcdr n seq) (cons element (nthcdr n seq)))
> to insert element into the nth position in seq

I think with `seq` you'd do something like

   (seq-concatenate 'list (seq-subseq seq 0 n)
                          (list element)
                          (seq-subseq seq n))

Of course, it's different because it's non-destructive, but insertion
into an array can't be done non-destructively anyway.

> The idea is I'll implement this function for the generic sequence
> that I'll define in the future. Is that a correct approach?
> Other destructive functions that I couldn't find alternatives are delete,
> push, pop, etc.

We currently don't have any data-structure that can be efficiently
modified in-place via push/pop (note that even lists don't qualify
because push/pop doesn't modify the list in place: they replace a list
with another without modifying any existing list (unless the PLACE is
the car/cdr of a list, of course, but that's a separate issue)).


        Stefan




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Generic sequences in seq.el
  2018-12-21 14:24 ` Stefan Monnier
@ 2018-12-23  2:04   ` Yuan Fu
  2018-12-23 14:34     ` Stefan Monnier
  0 siblings, 1 reply; 6+ messages in thread
From: Yuan Fu @ 2018-12-23  2:04 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1763 bytes --]

>   (seq-concatenate 'list (seq-subseq seq 0 n)
>                          (list element)
>                          (seq-subseq seq n))

That returns a list, not the sequence. So inserting something into the
sequence
makes it not a sequence anymore?

> We currently don't have any data-structure that can be efficiently
> modified in-place via push/pop (note that even lists don't qualify
> because push/pop doesn't modify the list in place: they replace a list
> with another without modifying any existing list (unless the PLACE is
> the car/cdr of a list, of course, but that's a separate issue)).

Thanks, it's good to know.

Yuan.

On Fri, Dec 21, 2018 at 9:24 AM Stefan Monnier <monnier@iro.umontreal.ca>
wrote:

> >     (setf (nthcdr n seq) (cons element (nthcdr n seq)))
> > to insert element into the nth position in seq
>
> I think with `seq` you'd do something like
>
>    (seq-concatenate 'list (seq-subseq seq 0 n)
>                           (list element)
>                           (seq-subseq seq n))
>
> Of course, it's different because it's non-destructive, but insertion
> into an array can't be done non-destructively anyway.
>
> > The idea is I'll implement this function for the generic sequence
> > that I'll define in the future. Is that a correct approach?
> > Other destructive functions that I couldn't find alternatives are delete,
> > push, pop, etc.
>
> We currently don't have any data-structure that can be efficiently
> modified in-place via push/pop (note that even lists don't qualify
> because push/pop doesn't modify the list in place: they replace a list
> with another without modifying any existing list (unless the PLACE is
> the car/cdr of a list, of course, but that's a separate issue)).
>
>
>         Stefan
>
>
>

[-- Attachment #2: Type: text/html, Size: 4637 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Generic sequences in seq.el
  2018-12-23  2:04   ` Yuan Fu
@ 2018-12-23 14:34     ` Stefan Monnier
  2019-01-08  4:12       ` Yuan Fu
  0 siblings, 1 reply; 6+ messages in thread
From: Stefan Monnier @ 2018-12-23 14:34 UTC (permalink / raw)
  To: Yuan Fu; +Cc: emacs-devel

>>   (seq-concatenate 'list (seq-subseq seq 0 n)
>>                          (list element)
>>                          (seq-subseq seq n))
>
> That returns a list, not the sequence.

I'm not sure which sequence is "the" sequence, but a list is
definitely a sequence.


        Stefan



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Generic sequences in seq.el
  2018-12-23 14:34     ` Stefan Monnier
@ 2019-01-08  4:12       ` Yuan Fu
  2019-01-08 15:01         ` Stefan Monnier
  0 siblings, 1 reply; 6+ messages in thread
From: Yuan Fu @ 2019-01-08  4:12 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 623 bytes --]

You are right. I can implement my own
method to return objects that are not vector, string or list.

Still, it would be convenient to have a function
that can destructively modify a sequence. What is
the reason to not have one?

Yuan

On Sun, Dec 23, 2018 at 9:34 AM Stefan Monnier <monnier@iro.umontreal.ca>
wrote:

> >>   (seq-concatenate 'list (seq-subseq seq 0 n)
> >>                          (list element)
> >>                          (seq-subseq seq n))
> >
> > That returns a list, not the sequence.
>
> I'm not sure which sequence is "the" sequence, but a list is
> definitely a sequence.
>
>
>         Stefan
>

[-- Attachment #2: Type: text/html, Size: 1623 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Generic sequences in seq.el
  2019-01-08  4:12       ` Yuan Fu
@ 2019-01-08 15:01         ` Stefan Monnier
  0 siblings, 0 replies; 6+ messages in thread
From: Stefan Monnier @ 2019-01-08 15:01 UTC (permalink / raw)
  To: emacs-devel

> Still, it would be convenient to have a function
> that can destructively modify a sequence. What is
> the reason to not have one?

Two reasons:
1- Side-effects are bad.
2- There hasn't yet been a compelling reason to add one.
3- As mentioned before "We currently don't have any data-structure that
   can be efficiently modified in-place via push/pop".


        Stefan




^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-01-08 15:01 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-12-21 11:42 Generic sequences in seq.el Yuan Fu
2018-12-21 14:24 ` Stefan Monnier
2018-12-23  2:04   ` Yuan Fu
2018-12-23 14:34     ` Stefan Monnier
2019-01-08  4:12       ` Yuan Fu
2019-01-08 15:01         ` Stefan Monnier

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).