微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

defstruct - :read-only 不是只读的

如何解决defstruct - :read-only 不是只读的

在我为 :read-only x 读到的 CLHS 中:“当 x 为真时,这指定不能更改此插槽;它将始终包含在构造时提供的值。”

我可以做到这一点(ccl、SBCL):

CL-USER> (defstruct foo
           (one 0 :read-only t))
FOO
CL-USER> (defparameter *foo* (make-foo))
*FOO*
CL-USER> *foo*
#S(FOO :ONE 0)
CL-USER> (setf (slot-value *foo* 'one) 1)
1 (1 bit,#x1,#o1,#b1)
CL-USER> *foo*
#S(FOO :ONE 1)

Lisp 不应该禁止更改此插槽吗?

解决方法

slot-value 不是您访问其类用 defstruct 定义的对象的字段的方式。这些对象根本没有可移植的命名槽:它们命名了访问器

某些实现会提供此类对象的字段名称,并且还可能允许使用 slot-value 访问它们:但是,此类行为完全不可移植。

如果您使用标准定义的语言工作,那么您应该无法修改使用 :read-only 选项定义的结构字段的值。

,

规范说:

setf 将不接受此插槽的阅读器功能

slot-value 不是由 defstruct 创建的阅读器函数。读取器函数是 foo-one(除非您使用 :conc-name 关键字覆盖命名方案)。所以如果你尝试这样做,你应该得到一个错误

(setf (foo-one *foo) 1)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。