LISP - 破坏性和非破坏性结构

时间:2013-06-11 08:37:24

标签: functional-programming lisp definition

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

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

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

(set 'x 1)

对不起,可能是一个非常基本的问题....感谢您的回答!

2 个答案:

答案 0 :(得分:7)

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

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

现在你可以扩展对数组,结构,CLOS对象等操作的意义。你也可以调用变量赋值'破坏性'等等。

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

答案 1 :(得分:5)

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

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

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