This is a bug in sbcl?

  • A+
Category:Languages

Why happen this in sbcl? Maybe a bug?

(defclass myclass ()   ((s1     :initform '((a . 1) (b . 2)))     (s2     :initform '((a . 1) (b . 2)))))  (defparameter ins (make-instance 'myclass))  (setf (cdr (assoc 'a (slot-value ins 's1))) 43) ;; change only slot s1  ;; here my problem  (slot-value ins 's1)  ;; => ((a . 44) (b . 2))) (slot-value ins 's2)  ;; => ((a . 44) (b . 2))) 

But if change :initform to :

(defclass myclass ()   ((s1     :initform '((a . 1) (b . 2)))     (s2     :initform '((a . 1) (b . 3))))) 

The problem disappears

I test this in sbcl 1.4.3 and 1.4.11. In clisp it seems that the problem does not arise.

 


No. You are modifying literal data, which has undefined consequences.

When you quote a list in source code, it means that the thing you want to work with is exactly the list that the reader produced from your source code—this is a literal list. Such things may be remembered by the reader so that two identical lists are not duplicated.

One way to fix this is to create the lists at runtime, using list and cons:

(defclass myclass ()   ((s1     :initform (list (cons a 1) (cons b 2)))     (s2     :initform (list (cons a 1) (cons b 2))))) 

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: