【问题标题】:LISP - destructive and non-destructive constructsLISP - 破坏性和非破坏性构造
【发布时间】:2013-06-11 08:37:24
【问题描述】:

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

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

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

(set 'x 1)

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

【问题讨论】:

标签: functional-programming lisp definition


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      相关资源
      最近更新 更多