Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop CLO中的插槽_Oop_Common Lisp - Fatal编程技术网

Oop CLO中的插槽

Oop CLO中的插槽,oop,common-lisp,Oop,Common Lisp,有谁能解释一下CLO中的“插槽”吗?我发现很难理解插槽名称后面的部分。即: (def类foo() (数据1:initarg foo)) “initarg”和其他类似的东西是什么意思?我正在重新阅读手册。所以,如果在座各位能向我这样的外行解释一下,我将不胜感激 谢谢 在插槽规范中,通用语法是(插槽名称[插槽选项值]…)。基本上权威的参考是,但简而言之: :reader读取插槽值的函数 :writer写入插槽值的函数 :访问器读取和(通过SETF)设置插槽值的函数 :initarg从MAKE-INS

有谁能解释一下CLO中的“插槽”吗?我发现很难理解插槽名称后面的部分。即:

(def类foo() (数据1:initarg foo))

“initarg”和其他类似的东西是什么意思?我正在重新阅读手册。所以,如果在座各位能向我这样的外行解释一下,我将不胜感激


谢谢

在插槽规范中,通用语法是(插槽名称[插槽选项值]…)。基本上权威的参考是,但简而言之:

: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用于初始化插槽。事实上,这个机制有点复杂,但通常这就足够了解了。