通过替一个槽定义一个访问器 (accessor),我们隐式地定义了一个可以引用到槽的函数,使我们不需要再调用 slot-value
函数。如果我们如下更新我们的 circle
类定义,
那我们能够分别通过 circle-radius
及 circle-center
来引用槽:
> (setf c (make-instance 'circle))
#<CIRCLE #XC5C726>
> (setf (circle-radius c) 1)
1
1
通过指定一个 :writer
或是一个 ,而不是 :accessor
,我们可以获得访问器的写入或读取行为。
现在当我们创建一个 circle
类的实例时,我们可以使用关键字参数 :initarg
给槽赋值,或是將槽的值设为 :initform
所指定的缺省值。
> (setf c (make-instance 'circle :radius 3))
#<CIRCLE #XC2DE0E>
> (circle-radius c)
3
> (circle-center c)
注意 的优先级比 initform
要高。
我们可以指定某些槽是共享的 ── 也就是每个产生出来的实例,共享槽的值都会是一样的。我们通过声明槽拥有 :allocation :class
来办到此事。(另一个办法是让一个槽有 :allocation :instance
,但由于这是缺省设置,不需要特别再声明一次。)当我们在一个实例中,改变了共享槽的值,则其它实例共享槽也会获得相同的值。所以我们会想要使用共享槽来保存所有实例都有的相同属性。
那么如果我们创立两家小报,无论一家的头条是什么,另一家的头条也会是一样的:
> (setf daily-blab (make-instance 'tabloid)
unsolicited-mail (make-instance 'tabloid))
#<TABLOID #x302000EFE5BD>
> (setf (tabloid-story daily-blab) 'adultery-of-senator)
ADULTERY-OF-SENATOR
> (tabloid-story unsolicited-mail)
译注: ADULTERY-OF-SENATOR 参议员的性丑闻。
若有给入 :documentation
属性的话,用来作为 slot
的文档字符串。通过指定一个 ,你保证一个槽里只会有这种类型的元素。类型声明会在 13.3 节讲解。