Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lisp中的所有数据都是不可变的吗?_Lisp - Fatal编程技术网

Lisp中的所有数据都是不可变的吗?

Lisp中的所有数据都是不可变的吗?,lisp,Lisp,在中,作者称赞函数式编程有两个主要的好特性。 但他没有提到(普通的)口齿不清 Lisp的数据是否满足“所有数据都是不可变的”?否。通用Lisp中的数据不是不可变的 如SBCL中所示,使用setf功能 * (setf x 0) 0 * x 0 * (setf x 1) 1 * x 1 在Common Lisp中,您可以选择使用函数式样式。避免使用setf、setq,这样就可以使用函数式编程语言。换句话说,不要更改任何变量值,不要在创建后更改复合数据结构(cons、vectors、structur

在中,作者称赞函数式编程有两个主要的好特性。 但他没有提到(普通的)口齿不清


Lisp的数据是否满足“所有数据都是不可变的”?

否。通用Lisp中的数据不是不可变的

如SBCL中所示,使用
setf
功能

* (setf x 0)
0
* x
0
* (setf x 1)
1
* x
1

在Common Lisp中,您可以选择使用函数式样式。避免使用
setf
setq
,这样就可以使用函数式编程语言。换句话说,不要更改任何变量值,不要在创建后更改复合数据结构(cons、vectors、structures等)的内容。函数接受输入并生成输出,而不修改状态


因此,虽然Common Lisp提供了一些必要的操作,但如果您不想使用这些操作,则不必使用它们。

在Common Lisp中,所有数据(如基本变量引用、列表、数组和哈希表)在默认情况下都是可变的,因此没有任何东西可以阻止用户更改变量的值,序列的元素或结构的字段

但是,如果我们谈论的不是原始数据类型,而是用户定义的数据,即CLOS结构和类,那么它们的插槽可以设置为只读。例如,对于结构:

(defstruct person
  (name nil :type string :read-only t)
  (age nil :type (integer 0 100)))

(let ((john (make-person :name "John" :age 30)))
  (princ john)
  ;; * `age' is mutable:
  (incf (person-age john))
  (princ john)
  ;; * `name' is not:
  ;; (setf (person-name john) "garbage name")
  ;; ^ you can't do this because the `defstruct' macro just don't emit SETFer
  ;;   for the `name' slot as you made it read-only.
  )
类为插槽提供了更多的访问控制(这类似于C中的
const
限定符的机制,不同之处在于在常见的Lisp中,它不是编译时保证,而是可以在重新启动时处理的异常),您可以为它们提供读写、只读、只读或无访问


有关详细信息,请参阅以下链接:


注意:如果取消对“person name”的调用的注释,则会收到关于未定义函数的样式警告(例如,在SBCL中),因此这是编译时保证的一种弱形式,禁止对特定插槽的写访问。该文章是典型的“新生”文章皈依函数式编程的宗教,做出典型的对命令式编程邪恶的无知的放弃。“我得救了”。(好吧,不是我字面上的意思,而是构造了一个类似于我的对象,只是没有命令式编程位。)我想你的例子并没有说x是可变的。举个例子:(定义x10)x=>10(定义yx)y=>10(定义x20)x=>20y=>10。X最初只是一个绑定到10的符号。值10没有改变。您刚刚将X绑定到另一个值。