Opened 12 years ago

Closed 12 years ago

#207 closed defect (invalid)

'sort' function truncates lists

Reported by: Brian Owned by: gb
Priority: major Milestone:
Component: ANSI CL Compliance Version: unspecific
Keywords: Cc:

Description

Welcome to Clozure Common Lisp Version 1.1-r7809 (DarwinPPC32)!

? (let ((x '(1 2 3)))

(sort x #'<) x)

(1 2 3) ? (let ((x '(1 3 2)))

(sort x #'<) x)

(1 2 3) ? (let ((x '(2 1 3)))

(sort x #'<) x)

(2 3) ? (let ((x '(2 3 1)))

(sort x #'<) x)

(2 3) ? (let ((x '(3 1 2)))

(sort x #'<) x)

(3) ? (let ((x '(3 2 1)))

(sort x #'<) x)

(3)

I know that 'sort' is a "destructive" operation, but I think this goes too far.

Note that the problem does not arise when the argument is a vector rather than a list:

? (let ((x '#(3 2 1)))

(sort x #'<) x)

#(1 2 3)

Also, 'stable-sort' exhibits the same behavior.

Change History (2)

comment:1 Changed 12 years ago by Brian

Sorry for the lame formatting of the original post. Here's what I hope is a more intelligible version:

Welcome to Clozure Common Lisp Version 1.1-r7809 (DarwinPPC32)!

? (let ((x '(1 2 3)))
    (sort x #'<) x)
(1 2 3) 

? (let ((x '(1 3 2)))
    (sort x #'<) x)
(1 2 3) 

? (let ((x '(2 1 3)))
    (sort x #'<) x)
(2 3) 

? (let ((x '(2 3 1)))
    (sort x #'<) x)
(2 3) 

? (let ((x '(3 1 2)))
    (sort x #'<) x)
(3) 

? (let ((x '(3 2 1)))
    (sort x #'<) x)
(3)

I know that 'sort' is a "destructive" operation, but I think this goes too far.

Note that the problem does not arise when the argument is a vector rather than a list:

? (let ((x '#(3 2 1)))
    (sort x #'<) x)
#(1 2 3)

Also, 'stable-sort' exhibits the same behavior.

comment:2 Changed 12 years ago by gb

  • Resolution set to invalid
  • Status changed from new to closed

This is absolutely, positively not a bug.

A good explanation of the issues involved can be found in section 3-3 of

http://www.faqs.org/faqs/lisp-faq/part3/

There are also issues related to using destructive operations (like SORT) on quoted constants. Consider:

? (defun maybe-sort-constant-list (sort-it)
    (let* ((x '(3 2 1)))
      (when sort-it (sort x #'<))
      x))
MAYBE-SORT-CONSTANT-LIST
? (maybe-sort-constant-list t)
(3)
? (maybe-sort-constant-list nil)
(3)

It is worth trying to understand what's happening here.

Note: See TracTickets for help on using tickets.