From: Andrea Corallo <acorallo@gnu.org>
To: Daniel Clemente <n142857@gmail.com>
Cc: 71116-done@debbugs.gnu.org
Subject: bug#71116: 30.0.50; comp-normalize-valset doesn't sort consistently
Date: Mon, 27 May 2024 14:50:18 -0400 [thread overview]
Message-ID: <yp1bk4rum1h.fsf@fencepost.gnu.org> (raw)
In-Reply-To: <yp1fru9zmpo.fsf@fencepost.gnu.org> (Andrea Corallo's message of "Wed, 22 May 2024 15:10:59 -0400")
Andrea Corallo <acorallo@gnu.org> writes:
> Daniel Clemente <n142857@gmail.com> writes:
>
>> Current code from comp-cstr.el:
>>
>> (defun comp-normalize-valset (valset)
>> "Sort and remove duplicates from VALSET then return it."
>> (cl-sort (cl-remove-duplicates valset :test #'eq)
>> (lambda (x y)
>> (cond
>> ((and (symbolp x) (symbolp y))
>> (string< x y))
>> ((and (symbolp x) (not (symbolp y)))
>> t)
>> ((and (not (symbolp x)) (symbolp y))
>> nil)
>> ((or (consp x) (consp y)
>> nil))
>> (t
>> (< (sxhash-equal x)
>> (sxhash-equal y)))))))
>>
>> This part:
>> ((or (consp x) (consp y)
>> nil))
>>
>> Seems like a typo; as if this was intended:
>> ((or (consp x) (consp y))
>> nil)
>>
>> In practice, it means it's not sorting well. The presence of a cons can even change how the other elements are sorted:
>>
>> ;; This produces: ((a . 1) 2 3)
>> (comp-normalize-valset '(
>> 2
>> 3
>> (a . 1)
>> ))
>>
>> ;; This produces: (2 3 (a . 1))
>> (comp-normalize-valset '(
>> (a . 1)
>> 2
>> 3
>> ))
>>
>> ;; This produces: (3 (a . 1) 2)
>> (comp-normalize-valset '(
>> 2
>> (a . 1)
>> 3
>> ))
>>
>> Since all three examples use a list with the same elements, I would expect the same result after sorting: a sorted list
>> (by some definition of sorted). Otherwise the function documentation must be adjusted.
>>
>> I'm just reporting this because I was reading new code and found this part hard to understand. I'm not familiar with the
>> comp-cstr.el code or with how this affects native compilation, or whether there's any bug. My example doesn't represent
>> how the actual code is used.
>>
>> For context, the original intention was to avoid comparing conses with sxhash-equal.
>> https://lists.gnu.org/archive/html/emacs-devel/2024-02/msg00406.html
>
> Yes this is my todo list, I think for how the code is now sorting should
> not even be necessary anymore, so I want to give it a try at remove it
> entirely.
Right, after thinking about I believe keeping some sorting is beneficial
performance-wise to have good cache hit rate. With 509e7f877ba
'comp-normalize-valset' sort by type and within each type it sorts only
(alphabetically) strings and symbols, so we don't rely anymore on
'sxhash-equal'.
Closing this then, happy to reopen if necessary.
Thanks!
Andrea
prev parent reply other threads:[~2024-05-27 18:50 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-22 13:27 bug#71116: 30.0.50; comp-normalize-valset doesn't sort consistently Daniel Clemente
2024-05-22 19:10 ` Andrea Corallo
2024-05-27 18:50 ` Andrea Corallo [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=yp1bk4rum1h.fsf@fencepost.gnu.org \
--to=acorallo@gnu.org \
--cc=71116-done@debbugs.gnu.org \
--cc=n142857@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).