有谁能解释一下CLOS中的“插槽”吗?我发现很难理解插槽名称后面的部分。这是在:
(defclass foo () (data1 :initarg foo))
'initarg‘和其他类似的东西是什么意思?我正在重读手册。所以,如果在座的各位能向我这样的门外汉解释一下,我将不胜感激。
谢谢!
发布于 2009-03-10 12:21:36
你的例子有点错误。它必须是:
(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是插槽的名称。在它后面,你可以找到成对的:keyword value。
:INITARG告诉您MAKE-INSTANCE的参数是什么。(make-instance 'foo :data1arg10);创建对象并将插槽data1设置为10。通常您应该使用关键字符号(如:data1arg )。
: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。
https://stackoverflow.com/questions/629631
复制相似问题