如果字符串是向量,为什么它们是不可变的?
If strings are vectors, why are they immutable?
如果字符串是字符向量,并且可以使用 elt 访问向量的元素,并且 elt 是可设置的 - 那么为什么字符串是不可变的?
字符串在 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
编译文件,那么编译器可能会检测到这些字符串是相等的并且只分配一个字符串。它可能会将它们放入只读存储器。还有其他问题。
总结
字符串是可变的。
不要修改代码中的文字字符串。
如果您需要可变性,请不要使用文字字符串。像这样:
* (defparameter *s* (format nil "aaa"))
*S*
* (setf (elt *s* 1) #\b)
#\b
* *s*
"aba"
如果字符串是字符向量,并且可以使用 elt 访问向量的元素,并且 elt 是可设置的 - 那么为什么字符串是不可变的?
字符串在 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
编译文件,那么编译器可能会检测到这些字符串是相等的并且只分配一个字符串。它可能会将它们放入只读存储器。还有其他问题。
总结
字符串是可变的。
不要修改代码中的文字字符串。
如果您需要可变性,请不要使用文字字符串。像这样:
* (defparameter *s* (format nil "aaa"))
*S*
* (setf (elt *s* 1) #\b)
#\b
* *s*
"aba"