Common lisp 不可变lisp对象

Common lisp 不可变lisp对象,common-lisp,immutability,Common Lisp,Immutability,彼得·塞贝尔在第六章。变量,脚注4,提到整数和字符是不可变的。(sds at将路径名添加到此短列表中。) 这是否意味着像复数、比率和浮点这样的非整数类型实际上是可变对象;也就是说,是否有可以进行破坏性修改的组件?例如,是否可以更改复数的实部?(然而,通常的方法——例如,(setf(real part cplx)2)不起作用。)或者,复数可能是一个不可变的对象,但具有一些特殊属性,这些属性不被整数所共享 另外,在各种copy-函数(以及复制其参数的remove等其他函数)期间,不复制更复杂的可变对

彼得·塞贝尔在第六章。变量,脚注4,提到整数和字符是不可变的。(sds at将路径名添加到此短列表中。)

这是否意味着像
复数
比率
浮点
这样的非整数类型实际上是可变对象;也就是说,是否有可以进行破坏性修改的组件?例如,是否可以更改复数的
实部
?(然而,通常的方法——例如,
(setf(real part cplx)2)
不起作用。)或者,复数可能是一个不可变的对象,但具有一些特殊属性,这些属性不被
整数所共享

另外,在各种
copy-
函数(以及复制其参数的
remove
等其他函数)期间,不复制更复杂的可变对象中存在的不可变对象是否正确;并且只复制包含可变对象的结构,同时保留相同的不可变对象?

您的问题是:

。。。复数是一个不可变的对象,但有一些特殊属性不是整数所共享的吗

这是事实,因为在您引用的注释中,在讨论直接表示与通过指针表示时,讨论了整数和字符的不变性:

作为一种优化,某些类型的对象,例如小于特定大小的整数和字符,可以直接在内存中表示,,而其他对象将由指向实际对象的指针表示。(重点是我的)

事实上,不同的其他对象是不可变的,如字符、所有数字、符号、路径名、函数等,但它们通常通过指针表示(这是“特殊属性”),因此注释中的讨论不适用于它们

对于关于复制运算符的最后一个问题,语义取决于特定的运算符(例如,请参见),例如,复制的容器是否包含元素,并且它与元素的易变性或不变性无关。

您要问的是:

。。。复数是一个不可变的对象,但有一些特殊属性不是整数所共享的吗

这是事实,因为在您引用的注释中,在讨论直接表示与通过指针表示时,讨论了整数和字符的不变性:

作为一种优化,某些类型的对象,例如小于特定大小的整数和字符,可以直接在内存中表示,,而其他对象将由指向实际对象的指针表示。(重点是我的)

事实上,不同的其他对象是不可变的,如字符、所有数字、符号、路径名、函数等,但它们通常通过指针表示(这是“特殊属性”),因此注释中的讨论不适用于它们


对于关于复制运算符的最后一个问题,语义取决于特定的运算符(例如,请参见),例如,复制的容器是否包含元素,并且它与元素的易变性或不变性无关。

脚注没有列出所有不可变类型。ANSI CL标准回答了是否可以更改某一类型的对象。如果未指定访问器/写入器,则无法更改该类型的对象。我不认为类型被显式指定为“不可变”。脚注只是没有列出所有不可变的类型。ANSI CL标准回答了是否可以更改某一类型的对象。如果未指定访问器/写入器,则无法更改该类型的对象。我不认为类型被显式指定为“不可变”。