如果字符串是字符的向量,并且可以使用elt访问向量的元素,并且elt是setf-able - 那么为什么字符串是不可变的?
答案 0 :(得分:14)
字符串在Common Lisp中不是不可变的,它们是可变的:
*
是Lisp侦听器的最后一个结果
CL-USER 5 > (make-string 10 :initial-element #\-)
"----------"
CL-USER 6 > (setf (aref * 5) #\|)
#\|
CL-USER 7 > **
"-----|----"
CL-USER 8 > (concatenate 'string "aa" '(#\b #\b))
"aabb"
CL-USER 9 > (setf (aref * 2) #\|)
#\|
CL-USER 10 > **
"aa|b"
您唯一不应该做的是修改代码中的文字字符串。后果未定义。这与其他文字数据存在同样的问题。
例如,文件包含:
(defparameter *lisp-prompt* "> ")
(defparameter *logo-prompt* "> ")
如果我们使用compile-file
编译文件,那么编译器可能会检测到这些字符串是相等的并且只分配一个字符串。它可能会将它们放入只读内存中。还有其他问题。
<强>摘要强>
字符串是可变的。
请勿修改代码中的文字字符串。
答案 1 :(得分:0)
如果您需要可变性,请不要使用文字字符串。像这样:
* (defparameter *s* (format nil "aaa"))
*S*
* (setf (elt *s* 1) #\b)
#\b
* *s*
"aba"