Subject: bug#79330: misleading ring-convert-sequence-to-ring

From: Eli Zaretskii <[email-masked]>
Date: Sat, 06 Sep 2025 11:38:54 +0300

> From: Liu Hui <[email-masked]>
> Date: Fri, 29 Aug 2025 11:35:11 +0800
> Cc: [email-masked]
> 
> On Thu, Aug 28, 2025 at 6:59 PM Eli Zaretskii <[email-masked]> wrote:
> >
> > --text follows this line-
> > > From: Liu Hui <[email-masked]>
> > > Date: Thu, 28 Aug 2025 18:47:00 +0800
> > >
> > > The docstring of ring-convert-sequence-to-ring says it "convert
> > > sequence SEQ to a ring", but it actually ignores any item equal to the
> > > first item, which is not mentioned:
> > >
> > > ELISP> (ring-convert-sequence-to-ring '(a a a))
> > > (2 1 . [nil nil a])
> > >
> > > ELISP> (ring-convert-sequence-to-ring '(a b c a b c))
> > > (1 5 . [nil c b c b a])
> > >
> > > I think either the function or the docstring need to be fixed.
> >
> > To decide whether we can fix the code would need to look at the
> > existing users of this function (not only in our tree), since it works
> > like it works for the last 18 years.
> 
> I have checked the only one usage (i.e. eshell-index-value) in emacs
> and many other examples in github. I think all users don't expect to
> ignore an item that is equal to the first item. For example:
> 
> 1. emacs -Q
> 2. (setq eshell-history-file-name nil)
> 3. M-x eshell
> 4. type the following commands separately in eshell buffer
> 
> echo 1
> echo 2
> echo 1
> echo 2
> echo $eshell-history-ring[-4..]
> 
> There should be four items in the last output, but actually three
> items due to ring-convert-sequence-to-ring.
> 
> 
> In other cases, the SEQ usually contains different items, so it works
> in these years.

Thanks.

I have no idea what is the significance of the first element of the
ring, and why no other element should be inserted that is equal to
that.  I could understand it if any consecutive 'equal' elements were
inserted only once, but that is not what the function does.

Stefan, any ideas why the code works as it is, and what, if anything,
we should do here?