Tenho uma classe na qual quero que alguns slots sejam nulos quando o objeto for criado, mas eles devem ser configuráveis apenas com objetos de um determinado tipo. Algo como:
(defclass Something ()
((foo :initarg :foo
:type (or character 'nil)
:initform nil
:accessor something-foo)))
Se eu disser apenas :type character
, ou :type (or character nil)
, então o SBCL reclama por NIL
não ser do tipo de caractere declarado. Se eu disser :type (or character 'nil)
, então parece que ele aceita caracteres e o tipo de símbolo, já que qualquer símbolo parece ser:
CL-USER> (defvar *foo* (make-instance 'Something))
*FOO*
CL-USER> (setf (something-foo *foo*) 'test)
TEST
CL-USER> (something-foo *foo*)
TEST
Existe uma maneira de afirmar que um slot é nulo ou possui o tipo fornecido? Ou devo simplesmente omitir o especificador de tipo e afirmar o tipo no método acessador ou escritor?
Editar:
Depois de pensar um pouco, talvez a expressão seja: :type character
deixe-o desvinculado e verifique se o slot está vinculado ou não, em vez de verificar se é nulo ou não nulo?