为什么在sbcl中发生这种情况?也许是个错误?
(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)))
但是如果将:initform更改为:
(defclass myclass ()
((s1
:initform '((a . 1) (b . 2)))
(s2
:initform '((a . 1) (b . 3)))))
问题消失了
我在 sbcl 1.4.3 和 1.4.11 中对此进行了测试。似乎没有出现问题。
最佳答案
否。您正在修改文字数据,这将带来不确定的后果。
当您在源代码中引用列表时,这意味着您要使用的东西正是阅读器从您的源代码生成的列表,这是一个文字列表。读者可能会记住这些事情,因此不会重复两个相同的列表。
解决此问题的一种方法是在运行时使用list
和cons
创建列表:
(defclass myclass ()
((s1
:initform (list (cons a 1) (cons b 2)))
(s2
:initform (list (cons a 1) (cons b 2)))))
关于lisp - 这是sbcl中的错误吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52086082/