String Clisp中的只读字符串

String Clisp中的只读字符串,string,readonly,clisp,String,Readonly,Clisp,我注意到Clisp中此代码的输出存在一些不一致之处: (defvar str "Another") (setf (char str 3) #\!) 当我从repl运行它时,我得到了期望的结果: [1]> (defvar str "Another") STR [2]> (setf (char str 3) #\!) #\! [3]> str "Ano!her" [4]> 但是,当我从脚本运行它时,会收到关于修改只读字符串的警告: *** - Attempt to mod

我注意到
Clisp
中此代码的输出存在一些不一致之处:

(defvar str "Another")
(setf (char str 3) #\!)
当我从repl运行它时,我得到了期望的结果:

[1]> (defvar str "Another")
STR
[2]> (setf (char str 3) #\!)
#\!
[3]> str
"Ano!her"
[4]>
但是,当我从脚本运行它时,会收到关于修改只读字符串的警告:

*** - Attempt to modify a read-only string: "Another"
我在运行此代码时遇到了此错误:

(print (do ((str "foobar")
            (i 0 (+ i 1)))
           ((= i (length str)) str)
         (setf (char str i) #\!)))
当块结束时绑定将消失时,将字符串
设为只读(我假设这与
不可变
)有什么意义?

为什么两个输出之间存在差异?

最后,有什么方法可以关闭它吗?我不觉得这个警告特别有用。

解决方案 首先,你看到的是一个,而不是一个

其次,您不能关闭它,但可以通过不可变字符串来避免它:

(print (do ((str (copy-seq "foobar"))
            (i 0 (+ i 1)))
           ((= i (length str)) str)
         (setf (char str i) #\!)))
动机 这是一个网络上经常讨论的话题

基本原因是:

  • 多线程环境中的安全性和
  • 更好的编译器
正当理由 根据:

试图修改只读数据表示错误。程序文本和 从文件加载的引用常量被视为只读数据。这 仅对字符串执行检查,而不对conse和其他类型的 数组和用户定义的数据类型

这是政府明确允许的:

检测修改的尝试不需要实现 不变的物体或细胞;试图制造危险的后果 此类修改未定义

解决方案 首先,你看到的是一个,而不是一个

其次,您不能关闭它,但可以通过不可变字符串来避免它:

(print (do ((str (copy-seq "foobar"))
            (i 0 (+ i 1)))
           ((= i (length str)) str)
         (setf (char str i) #\!)))
动机 这是一个网络上经常讨论的话题

基本原因是:

  • 多线程环境中的安全性和
  • 更好的编译器
正当理由 根据:

试图修改只读数据表示错误。程序文本和 从文件加载的引用常量被视为只读数据。这 仅对字符串执行检查,而不对conse和其他类型的 数组和用户定义的数据类型

这是政府明确允许的:

检测修改的尝试不需要实现 不变的物体或细胞;试图制造危险的后果 此类修改未定义

解决方案 首先,你看到的是一个,而不是一个

其次,您不能关闭它,但可以通过不可变字符串来避免它:

(print (do ((str (copy-seq "foobar"))
            (i 0 (+ i 1)))
           ((= i (length str)) str)
         (setf (char str i) #\!)))
动机 这是一个网络上经常讨论的话题

基本原因是:

  • 多线程环境中的安全性和
  • 更好的编译器
正当理由 根据:

试图修改只读数据表示错误。程序文本和 从文件加载的引用常量被视为只读数据。这 仅对字符串执行检查,而不对conse和其他类型的 数组和用户定义的数据类型

这是政府明确允许的:

检测修改的尝试不需要实现 不变的物体或细胞;试图制造危险的后果 此类修改未定义

解决方案 首先,你看到的是一个,而不是一个

其次,您不能关闭它,但可以通过不可变字符串来避免它:

(print (do ((str (copy-seq "foobar"))
            (i 0 (+ i 1)))
           ((= i (length str)) str)
         (setf (char str i) #\!)))
动机 这是一个网络上经常讨论的话题

基本原因是:

  • 多线程环境中的安全性和
  • 更好的编译器
正当理由 根据:

试图修改只读数据表示错误。程序文本和 从文件加载的引用常量被视为只读数据。这 仅对字符串执行检查,而不对conse和其他类型的 数组和用户定义的数据类型

这是政府明确允许的:

检测修改的尝试不需要实现 不变的物体或细胞;试图制造危险的后果 此类修改未定义


Soo,该检查未在repl?Soo中执行,该检查未在repl?Soo中执行,该检查未在repl?Soo中执行,该检查未在repl?Soo中执行?