Soy consciente de que esto es bastante antiguo, pero creo que el punto más importante que debe hacerse aquí es:
No utilice slot-value
así!
el fin de obtener un descriptor de acceso, utilice los :accessor
o :reader
opciones de ranura, y para pasar valores al constructor, utilice :initarg
:
(defclass foo()
((bar :accessor foo-bar :initarg :bar)))
Esto significa: crear un método getter y un expansor setf llamado foo-bar
, y use un argumento de palabra clave llamado :bar
en make-instance
para inicializar el valor de este intervalo.
Ahora usted puede crear una instancia de un objeto tal como esto:
(make-instance 'foo :bar "quux")
o, si se obtiene una lista de propiedades de initargs (como Rainer ya había mostrado):
(let ((initargs (list :bar "quux"))) ; getting this from somewhere
(apply #'make-instance 'foo initargs))
entonces se puede obtener el valor de la siguiente manera:
(foo-bar some-foo)
y configurarlo con setf
como de costumbre:
(setf (foo-bar some-foo) "wobble")
Si utiliza :reader
en lugar de :accessor
, no está permitido ajuste. Esto a menudo es útil para comunicar el intento de inmutabilidad.
Slot-value
es realmente para situaciones especiales en la vida de un objeto, como cuando se juega con los métodos para initialize-instance
. Ese es un tema avanzado.
Gran respuesta. Gracias. – sbenitezb