CLOS中的插槽

时间:2009-03-10 10:40:47

标签: oop common-lisp

任何客户都可以在CLOS中解释'老虎机'吗?我发现很难理解插槽名称后面的部分。那是在:

(defclass foo()  (data1:initarg foo))

'initarg'和其他类似的东西是什么意思?我正在重读手册。所以,如果你们中的任何一个人能像我一样向外行解释,我真的很感激。

谢谢!

2 个答案:

答案 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的描述如下:DEFCLASSShort 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)。