Oop CLO中的插槽
有谁能解释一下CLO中的“插槽”吗?我发现很难理解插槽名称后面的部分。即: (def类foo() (数据1:initarg foo)) “initarg”和其他类似的东西是什么意思?我正在重新阅读手册。所以,如果在座各位能向我这样的外行解释一下,我将不胜感激Oop CLO中的插槽,oop,common-lisp,Oop,Common Lisp,有谁能解释一下CLO中的“插槽”吗?我发现很难理解插槽名称后面的部分。即: (def类foo() (数据1:initarg foo)) “initarg”和其他类似的东西是什么意思?我正在重新阅读手册。所以,如果在座各位能向我这样的外行解释一下,我将不胜感激 谢谢 在插槽规范中,通用语法是(插槽名称[插槽选项值]…)。基本上权威的参考是,但简而言之: :reader读取插槽值的函数 :writer写入插槽值的函数 :访问器读取和(通过SETF)设置插槽值的函数 :initarg从MAKE-INS
谢谢 在插槽规范中,通用语法是(插槽名称[插槽选项值]…)。基本上权威的参考是,但简而言之: :reader读取插槽值的函数
:writer写入插槽值的函数
:访问器读取和(通过SETF)设置插槽值的函数
:initarg从MAKE-INSTANCE设置插槽值的符号
还有更多,但这个列表是我最常用的四个(实际上,我最常用的是:initarg和:accessor:reader中的一个)。您的示例稍有错误。它必须是:
(defclass foo ()
((data1 :initarg foo)))
请注意,添加的括号表示插槽描述的列表
DEFCLASS获取插槽列表。因此,我们有两个插槽:
(defclass foo ()
((data1 :initarg :data1arg
:initform (random 1.0)
:type number
:documentation "doc here"
:accessor foo-data1-acc)
(data2 :initarg :data2arg)))
DATA1是插槽的名称。在这之后,您可以找到成对的:关键字值
:INITARG告诉您MAKE-INSTANCE的参数是什么。
(将“foo:data1arg 10”作为实例);创建对象并将插槽数据1设置为10。
通常,您应该使用关键字符号(如:data1arg)
:INITFORM在创建对象时默认设置插槽。例如:
(以“foo”为例);创建对象。插槽被设置为initform的值
:TYPE指定插槽对象的类型
:文档只是文档的字符串
:ACCESSOR指定用于读取和写入插槽的函数
(foo-data1-acc some-foo-object-here) ; read
(setf (foo-data1-acc some-foo-object-here) 7) ; write
请注意,您可以按任何顺序写入对,并且还可以指定多个访问器函数。还有:READER和:WRITER函数
使用CLOS,您可以在DEFCLASS宏中指定所有这些。这些东西不会像defstruct那样自动生成,因为defstruct的符号较短
DEFCLASS的说明如下所示:。
.在:INITFORM的描述中,插槽数据1应该设置为10,还是设置为0到1.0的随机值?是的,这是一个错误。以上已更正。当没有给出initarg时,initform用于初始化插槽。事实上,这个机制有点复杂,但通常这就足够了解了。