2015-06-14 81 views

回答

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的文件,然后编译器可能会检测出这些字符串是平等的,只分配一个字符串。它可能会将它们放入只读内存。还有其他问题。

摘要

字符串是可变的。

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

+2

好吧,显然我混合了不变性与事实,你不应该修改文字。感谢您的澄清! –

0

如果您需要可变性,请勿使用文字字符串。像这样:

* (defparameter *s* (format nil "aaa")) 
*S* 

* (setf (elt *s* 1) #\b) 
#\b 

* *s* 
"aba" 
相关问题