common-lisp Creazione di una classe CLOS di base senza genitori


Esempio

Una classe CLOS è descritta da:

  • un nome
  • una lista di superclassi
  • una lista di slot
  • ulteriori opzioni come documentazione

Ogni slot ha:

  • un nome
  • un modulo di inizializzazione (facoltativo)
  • un argomento di inizializzazione (facoltativo)
  • un tipo (facoltativo)
  • una stringa di documentazione (opzionale)
  • funzioni accessorie, lettore e / o scrittore (opzionale)
  • ulteriori opzioni come l'assegnazione

Esempio:

(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 metodo di stampa predefinito:

(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))))

Creare istanze:

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>