不可变的lisp对象

时间:2017-02-25 17:29:41

标签: common-lisp immutability

Peter Seibel在Practical Common Lisp Ch 6.变量,脚注4中提到整数和字符是不可变的。 (对于这个简短的列表,Nondestructive setf?处的sds添加了路径名。)

这是否意味着像complexratiofloat这样的非整数类型实际上是可变对象;也就是说,是否有可以破坏性修改的组件?例如,是否可以更改复数的real-part? (但是,通常的方法 - 例如,(setf (real-part cplx) 2)不起作用。)或者也许是一个复数的不可变对象,但是integer没有共享某些特殊属性?

另外,在各种copy-函数(以及复制其参数的其他函数,如remove)期间,不会复制更复杂的可变对象中存在的不可变对象,这是正确的吗?并且只保留由封闭的可变对象提供的结构,同时保留相同的不可变对象?

1 个答案:

答案 0 :(得分:2)

你在问:

  

...是一个复数,是一个不可变对象,但有一些特殊属性不是由整数共享的?

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

  

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

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

关于复制运算符的最后一个问题,语义取决于特定的运算符(例如参见copy-seq),例如,如果复制的容器是否包含same元素,则它是与他们的可变性或不变性无关。