common-lisp Creando una clase básica de CLOS sin padres


Ejemplo

Una clase CLOS es descrita por:

  • un nombre
  • una lista de superclases
  • una lista de ranuras
  • otras opciones como documentación

Cada ranura tiene:

  • un nombre
  • un formulario de inicialización (opcional)
  • un argumento de inicialización (opcional)
  • un tipo (opcional)
  • una cadena de documentación (opcional)
  • Funciones de acceso, lector y / o escritor (opcional)
  • otras opciones como la asignación

Ejemplo:

(defclass person ()
  ((name
    :initform      "Erika Mustermann" 
    :initarg       :name 
    :type          string
    :documentation "the name of a person"
    :accessor      person-name)
   (age
    :initform      25
    :initarg       :age
    :type          number
    :documentation "the age of a person"
    :accessor      person-age))
  (:documentation "a CLOS class for persons with name and age"))

Un método de impresión predeterminado:

(defmethod print-object ((p person) stream)
  "The default print-object method for a person"
  (print-unreadable-object (p stream :type t :identity t)
    (with-slots (name age) p
      (format stream "Name: ~a, age: ~a" name age))))

Creando instancias:

CL-USER > (make-instance 'person)
#<PERSON Name: Erika Mustermann, age: 25 4020169AB3>

CL-USER > (make-instance 'person :name "Max Mustermann" :age 24)
#<PERSON Name: Max Mustermann, age: 24 4020169FEB>