unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Daniel Clemente <n142857@gmail.com>
To: 71116@debbugs.gnu.org
Cc: acorallo@gnu.org
Subject: bug#71116: 30.0.50; comp-normalize-valset doesn't sort consistently
Date: Wed, 22 May 2024 13:27:15 +0000	[thread overview]
Message-ID: <CAJKAhPBVw7y7gm09R3p_Jq3fHoG74fSO_3pNk_7LCqwCMJpsWQ@mail.gmail.com> (raw)

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

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

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

             reply	other threads:[~2024-05-22 13:27 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-22 13:27 Daniel Clemente [this message]
2024-05-22 19:10 ` bug#71116: 30.0.50; comp-normalize-valset doesn't sort consistently Andrea Corallo
2024-05-27 18:50   ` Andrea Corallo

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=CAJKAhPBVw7y7gm09R3p_Jq3fHoG74fSO_3pNk_7LCqwCMJpsWQ@mail.gmail.com \
    --to=n142857@gmail.com \
    --cc=71116@debbugs.gnu.org \
    --cc=acorallo@gnu.org \
    /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).