archives

Unexpected lisp setf behaviour

Hi Folks,

In writing some lisp code for uni coursework ("bin-packing" EA problem), I've encountered some weird behaviour. I copy a list, containing an element of type 'item', and attempt to set a value on the copy only. The code below is a modified excerpt but displays what I mean - I expected the 'container' in X to be 0, and its equivalent in M to be something random, but both elements get set to the same random value.

(defstruct item
id
weight
type
container)

(setq X (list (make-item
:id 0
:weight 0
:type 0
:container 0)))

(setq M (copy-list X))
(setf (item-container (nth 0 M)) (random 50))

I'm fairly new to lisp, so I'm not sure if this is correct or not (I suspect that it is, since clisp and emacs lisp behave the same way). Can someone point me in the right direction?

edit: Adding my solution for anyone googling for a similar problem:
(defun copy-item-list (s)
(if s
(cons (copy-item (car s))
(copy-item-list (cdr s))))
)
Good shout, johnwcowan.