我有一个类,希望在创建对象时将某些槽位设置为 nil,但这些槽位只能由特定类型的对象设置。例如:
(defclass Something ()
((foo :initarg :foo
:type (or character 'nil)
:initform nil
:accessor something-foo)))
如果我说只是:type character
,或:type (or character nil)
,那么 SBCL 会抱怨它NIL
不属于断言的字符类型。如果我说:type (or character 'nil)
,那么它似乎接受字符和符号类型,因为任何符号似乎都适用:
CL-USER> (defvar *foo* (make-instance 'Something))
*FOO*
CL-USER> (setf (something-foo *foo*) 'test)
TEST
CL-USER> (something-foo *foo*)
TEST
有没有办法断言一个 slot 是 nil 还是具有给定的类型?或者我应该省略类型说明符,然后在访问器或写入器方法中断言类型?
编辑:
再三考虑之后,也许习惯用法是说:type character
但保持其不受约束,然后检查插槽是否被绑定,而不是检查是否为零和非零?