任何客户都可以在CLOS中解释'老虎机'吗?我发现很难理解插槽名称后面的部分。那是在:
(defclass foo() (data1:initarg foo))
'initarg'和其他类似的东西是什么意思?我正在重读手册。所以,如果你们中的任何一个人能像我一样向外行解释,我真的很感激。
谢谢!
答案 0 :(得分:8)
你的例子有点不对劲。它必须是:
(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的参数是什么。 (make-instance'foo:data1arg 10);创建对象并将插槽data1设置为10。 通常你应该使用关键字符号(例如:data1arg here。)。
:INITFORM在创建对象时默认设置插槽。像: (make-instance'foo);创建对象。插槽设置为initform的值。
:TYPE指定插槽对象的类型。
:DOCUMENTATION只是文档的一个字符串。
: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的描述如下:DEFCLASS。 Short CLOS Intro
答案 1 :(得分:1)
在插槽规范中,一般语法是( slot-name [ slot-option option-value ] ...)。基本上是authoritatiev的引用是the HyperSpec page on defclass,但简而言之:
:阅读器读取插槽值的功能
:writer 写入插槽值的函数
:accessor 读取和(通过SETF)设置插槽值的功能
:initarg 从MAKE-INSTANCE设置广告位值的符号
还有更多,但是这个列表是我主要使用的四个(实际上,我主要使用:initarg和其中一个:accessor或:reader)。