7

LISP(或一般)中破坏性非破坏性构造的正确定义是什么。我试图寻找实际含义,但我只发现了这些术语的很多用法,而没有实际解释它们。

据我了解,破坏性函数是指一个函数,它改变构造(或变量)的含义 - 所以当我将列表作为参数传递给函数时,它会改变它,它被称为破坏性操作,因为它会更改初始列表并返回一个全新的列表。这是正确的还是有一些例外?

那么例如设置一个破坏性函数(因为它改变了 x 的值)?我认为不是,但我不知道如何,我将如何证明这一点。

(set 'x 1)

抱歉,可能是一个非常基本的问题....感谢您的任何回答!

4

2 回答 2

7

我不会过多地解释“破坏性”这个词。

在列表处理中,破坏性操作是一种可能将一个或多个输入列表更改为可见副作用的操作。

现在,您可以将含义扩大到对数组、结构、CLOS 对象等的操作。您还可以将变量赋值称为“破坏性”等。

在 Common Lisp 中,谈论对序列(通常是列表、字符串和向量)和多维数组的破坏性操作是有意义的。

于 2013-06-11T09:21:57.653 回答
5

Practical Common Lisp区分了两种破坏性操作: for-side-effect操作和回收操作。

set具有破坏性和副作用:它总是修改它的第一个参数。请注意,它会更改符号的绑定,但不会更改当前绑定到该符号的事物。setf可以就地更改绑定或对象。

相比之下,nreverse是回收:它允许修改它的参数列表,虽然不能保证它会,所以它应该像reverse(获取返回值)一样使用,除了输入参数可能被“销毁”并且不应该不再使用。[方案程序员可以称其为“线性更新”函数。]

于 2013-06-11T08:59:57.663 回答