Я пытаюсь узнать о CLOS, и написал пример класса. У этого есть 4 слота, названных slot1-4. slot2 имеет initform, но тем не менее я получаю эту ошибку: «Слот COMMON-LISP-USER :: SLOT2 не связан в объекте». Я не вижу, как это возможно. Я использую SBCL и мой код выглядит следующим образом:
;;;; The following is meant to demonstrate some concepts of object initialisation
(defclass example ()
((slot1
:initarg :slot1-arg
:initform (error "must supply a slot1"))
(slot2
:initform "This is the initform"
:reader slot2-reader
:writer (setf slot2-writer))
(slot3
:accessor slot3-accessor
:documentation "The third slot")
(slot4)))
(defmethod initialize-instance :after ((instance example) &key)
(setf (slot-value instance 'slot4)
"this was set in INITIALIZE-INSTANCE"))
(let ((xampl (make-instance 'example
:slot1-arg "Must provide this or there will be an error")))
(setf (slot3-accessor xampl)
"it is necessary to initialize this slot, as there is not initform or initarg")
(print (slot3-accessor xampl))
(setf (slot-value xampl 'slot3) "this also works")
(print (slot-value xampl 'slot3))
(print (slot2-reader xampl)))