如果字符串是向量,为什么它们是不可变的?

Gol*_*den 4 lisp common-lisp

如果字符串是字符的向量,并且可以使用elt访问向量的元素,并且elt是setf-able - 那么为什么字符串是不可变的?

Rai*_*wig 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"
Run Code Online (Sandbox Code Playgroud)

您不应该做的唯一事情是修改代码中的文字字符串.后果未定义.这与其他文字数据存在同样的问题.

例如,文件包含:

(defparameter *lisp-prompt* "> ")

(defparameter *logo-prompt* "> ")
Run Code Online (Sandbox Code Playgroud)

如果我们使用编译文件compile-file,那么编译器可能会检测到这些字符串是相等的并且只分配一个字符串.它可能会将它们放入只读内存中.还有其他问题.

摘要

字符串是可变的.

不要修改代码中的文字字符串.

  • 好吧,显然我把不变性与你不应该修改文字这一事实混为一谈.谢谢你的澄清! (2认同)