Per esempio si desidera denominare le dimensioni dei caratteri:
(defconstant +large+ 3)
(defconstant +medium+ 2)
(defconstant +small+ 1)
Si potrebbe scrivere una macro per fare quel breve.
Sopra le definizioni costanti di solito vengono scritte SOLO quando questi numeri devono essere passati a un codice esterno non Lisp.
Altrimenti si userebbero solo simboli di parole chiave:: grande,: medio e: piccolo.
È possibile testarli con EQ e tutto ciò che utilizza un test per l'uguaglianza.
(let ((size :medium))
(ecase size
(:small ...)
(:medium ...)
(:large ...)))
Si può anche scrivere i metodi per esso:
(defmethod draw-string (message x y (size (eql :large))) ...)
Come accennato si potrebbe definire un tipo di set:
(deftype size() '(member :small :medium :large))
Quindi è possibile controllare se qualcosa è uno di questi:
(let ((my-size :medium))
(check-type my-size size))
Sopra sarebbe segnala un errore se my-size non è uno dei seguenti: small,: medium o: large.
È inoltre possibile utilizzare il tipo in una forma defclass:
(defclass vehicle()
((width :type size :initarg :width)))
Ora si potrebbe creare oggetti come qui:
(make-instance 'vehicle :width :large)
Alcune implementazioni Common Lisp controllerà quando si imposta lo slot a qualche valore illegale
Se ora create oggetti di classe veicolo, gli slot saranno uno di: grande,: medio o: piccolo. Se guardi l'oggetto in un debugger, in un ispettore o in qualche altro strumento, vedrai i nomi simbolici e non 1, 2 o 3 (o qualunque valore tu usi normalmente).
Questo è parte dello stile Lisp: utilizzare nomi simbolici quando possibile. Utilizzare i simboli con valori numerici solo nel codice di interfaccia per le funzioni esterne (ad esempio chiamando un codice C esterno che utilizza enumerazioni).
Sì, ma utilizzare le parole chiave meglio. – kmkaplan
Questo è un buon punto: utilizzando la parola chiave si evita di doversi preoccupare del pacchetto in cui si trovano i simboli. –
In realtà, le funzioni generiche possono specializzarsi solo sulle classi, non sui tipi arbitrari. –