CLOS中的插槽

6 oop common-lisp

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

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

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

谢谢!

Rai*_*wig 8

你的例子有点不对劲.它一定要是:

(defclass foo ()
   ((data1 :initarg foo)))
Run Code Online (Sandbox Code Playgroud)

请注意添加的括号以指示插槽描述列表.

DEFCLASS获取一个插槽列表.所以我们有两个插槽:

(defclass foo ()
   ((data1 :initarg :data1arg
           :initform (random 1.0) 
           :type number
           :documentation "doc here"
           :accessor foo-data1-acc)
    (data2 :initarg :data2arg)))
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

请注意,您可以按任何顺序编写对,也可以指定多个访问者函数.还有:READER和:WRITER功能.

使用CLOS,您可以指定DEFCLASS宏中的所有内容.这些东西不会像defstruct一样自动生成,defstruct的符号较短.

DEFCLASS的描述如下:DEFCLASS. 简短的CLOS简介.