defstruct - :read-only 不是只读的
defstruct - :read-only is not 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 不应该禁止更改此插槽吗?
规范说:
setf
will not accept the reader function for this slot.
slot-value
不是 defstruct
创建的 reader 函数。 reader 函数是 foo-one
(除非您使用 :conc-name
关键字覆盖命名方案)。所以如果你尝试这样做,你应该会得到一个错误
(setf (foo-one *foo) 1)
slot-value
不是您访问 class 定义为 defstruct
的对象字段的方式。这些对象根本没有可移植的命名槽:它们命名为 accessors.
一些实现给出了此类对象名称的字段,并且还可能允许使用 slot-value
访问它们:但是这种行为是完全不可移植的。
如果您使用标准定义的语言工作,那么您应该无法修改使用 :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 不应该禁止更改此插槽吗?
规范说:
setf
will not accept the reader function for this slot.
slot-value
不是 defstruct
创建的 reader 函数。 reader 函数是 foo-one
(除非您使用 :conc-name
关键字覆盖命名方案)。所以如果你尝试这样做,你应该会得到一个错误
(setf (foo-one *foo) 1)
slot-value
不是您访问 class 定义为 defstruct
的对象字段的方式。这些对象根本没有可移植的命名槽:它们命名为 accessors.
一些实现给出了此类对象名称的字段,并且还可能允许使用 slot-value
访问它们:但是这种行为是完全不可移植的。
如果您使用标准定义的语言工作,那么您应该无法修改使用 :read-only
选项定义的结构字段的值。