3

这篇文章中,作者称赞了函数式编程的两个主要优点。但他没有提到(通用)Lisp。

Lisp 的数据是否符合这个“所有数据都是不可变的”?

4

3 回答 3

8

在 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.
  )

类为插槽提供了更多的访问控制(这类似于constC 中限定符的机制,不同的是在 Common Lisp 中它不是编译时保证,而是可以在重新启动时处理的异常),您可以授予他们读写、只读、只写或无访问权限。


有关更多信息,请参阅以下链接:

于 2012-04-17T07:22:19.200 回答
6

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

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

于 2012-04-17T05:37:39.517 回答
0

不,Common Lisp 中的数据不是不可变的。

setf如使用函数在 SBCL 中所见

* (setf x 0)
0
* x
0
* (setf x 1)
1
* x
1
于 2012-04-17T05:15:07.297 回答