[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: MCL 2.0b1p3 sort problems
- To: asb@media-lab.media.mit.EDU
- Subject: RE: MCL 2.0b1p3 sort problems
- From: Kevin Gallagher <Gallagher@gilgamesh.cs.umass.edu>
- Date: Wed, 10 Jul 91 16:43:09 EDT
- Cc: info-mcl@cambridge.apple.COM
- In-reply-to: <9107101523.AA09709@media-lab.media.mit.edu>
- Reply-to: Gallagher@gilgamesh.cs.umass.edu
- Sender: Gallagher@Gilgamesh.cs.umass.edu
It is a common misperception that destructive functions in common lisp,
such as delete, nreverse, sort, etc. operate *soley* by side effect.
This is not true. As noted in CLtL when describing NREVERSE:
``The result may or may not be EQ to the argument, so it is
usually wise to say something like (SETQ X (NREVERSE X)),
because simply (NREVERSE X) is not guarenteed to leave a
reversed value in X.''
This applies to all destructive operations, use (SETQ X (SORT X #'<)), etc.
This misperception is probably due to the fact that relying on side
effect will work *sometimes*. The confusion and irate messages
about Common Lisp are due to the fact that relying on side effect
will not always work.
A typical example is deleting an element from a list. If it turns
out that you are keeping the first element, then side effect alone
will work fine:
(setq x '(1 2 3 4 5 6))
(delete-if #'evenp x) => (1 3 5)
x => (1 3 5)
However, if you are deleting the first element then you will get a
surprise:
(setq x '(1 2 3 4 5 6))
(delete-if #'oddp x) => (2 4 6)
x => (1 2 4 6)