如果字符串是字符的向量,并且可以使用elt访问向量的元素,并且elt是setf-able - 那么为什么字符串不可变?如果字符串是矢量,为什么它们是不变的?
4
A
回答
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
的文件,然后编译器可能会检测出这些字符串是平等的,只分配一个字符串。它可能会将它们放入只读内存。还有其他问题。
摘要
字符串是可变的。
不要修改代码中的文字字符串。
0
如果您需要可变性,请勿使用文字字符串。像这样:
* (defparameter *s* (format nil "aaa"))
*S*
* (setf (elt *s* 1) #\b)
#\b
* *s*
"aba"
相关问题
- 1. python中的字符串变体 - 它们是什么意思?
- 2. 在Eval函数中,如果某些字符串变量不是它们的,我怎么能跳过它
- 3. PHP - 什么是常量,它们是不错的练习,它们与变量有什么不同?
- 4. 如果检查循环变量是字符串(不变量==字符串[index_Integer])
- 5. 什么是“字符串数学”,为什么它不好?
- 6. 如果我们不能释放它,malloc的行为是什么
- 7. 为什么字符串和矢量的不同类型?
- 8. 什么是矢量?
- 9. 为什么两个字符串看起来相同,但它们不是?
- 10. 字符串类型是一个标量,如果是这样,为什么?
- 11. 为什么矢量的矢量不能保证是连续的? (或者是吗?)
- 12. 为什么java中的字符串是不可变的?
- 13. 为什么我的矢量是空的?
- 14. 检查字符串矢量是元素
- 15. 为什么我不能接收字符串,它是空
- 16. 变量字符串=值(字符串),但结果是假
- 17. 为什么我的公共字符串不改变它的字符串?
- 18. 如果Java字符串是不可变的,并且StringBuilder是可变的,他们为什么会浪费我的代码中相同数量的内存?
- 19. 为什么ES6模板字符串是他们的方式?
- 20. 为什么我的变量取决于它们是数组还是整数?
- 21. 为什么字符串总是空的?
- 22. 为什么不是标量的结果?
- 23. 什么是矢量图?
- 24. 什么是这个PHP exec()的字符串与变量结果的解释?
- 25. 这些数字是什么,它们的类型是什么?
- 26. 为什么对象是矢量?
- 27. `class_eval`字符串中的变量作用域是什么?
- 28. 什么是空字符串或null变量的JSON标准?
- 29. 为什么bool(true)&& string的结果是javascript中的字符串?
- 30. WOFF字体,它们是什么以及为什么要关心?
好吧,显然我混合了不变性与事实,你不应该修改文字。感谢您的澄清! –