gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:41:04 24 4
gpt4 key购买 nike

this article ,作者称赞函数式编程有两个主要的好特性。但他没有提到(通用)Lisp。

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 限定符的机制,不同之处在于在 Common Lisp 中它不是编译时保证,而是可以在重新启动时处理的异常),您可以为它们提供读写、只读、只写或无访问权限。


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

关于lisp - Lisp 中的所有数据都是不可变的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10185417/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com