[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: MCL 2.0b1p3 sort problems
- To: Adnan Hamid <ahamid@clarity.Princeton.EDU>
- Subject: Re: MCL 2.0b1p3 sort problems
- From: Bill St. Clair <bill>
- Date: Wed, 10 Jul 91 10:11:34 -0400
- Cc: info-mcl@cambridge.apple.com
- In-reply-to: Your message of Wed, 10 Jul 91 02:33:31 -0400. <9107100633.AA09771@clarity.Princeton.EDU>
Date: Wed, 10 Jul 91 02:33:31 EDT
From: Adnan Hamid <ahamid@clarity.Princeton.EDU>
To: info-mcl@cambridge.apple.com
Subject: MCL 2.0b1p3 sort problems
According to my copy of Steel, (sort <sequence> <predicate>) *distructively*
sorts the sequence that it is given. One presumes that the following behaviour
is incorrect:
Welcome to Macintosh Common Lisp Version 2.0b1p3!
? (setq foo '(1 2 3))
(1 2 3)
? (sort foo #'>)
(3 2 1)
? foo
(1)
?
CLtL Second Edition p. 408 states:
"The sorting operation may be destructive in all cases. In the case
of an array argument, this is accomplished by permuting the elements
in place. In the case of a list, the list is destructively reordered
in the same manner as for NREVERSE. Thus if the argument should not be
destroyed, the user myst sort a copy of the argument."
The SORT in MCL 1.3.2 preserved the initial cons when sorting so that
it still pointed at the sorted list (the rest of whose conses were
completely reordered). It did this at the expense of consing, however.
If you like this behavior, you can easily do it yourself:
(defun consing-sort (sequence predicate &key key)
(if (and sequence (listp sequence))
(let ((first-cons sequence)
(res (sort (cons (car sequence) (cdr sequence)) predicate
:key key)))
(setf (car first-cons) (car res)
(cdr first-cons) (cdr res))
first-cons)
(sort sequence predicate :key key)))